检查XSLT中的CR或LF

检查XSLT中的CR或LF,xslt,Xslt,我有这样一个输入XML: <in_xml> <company> <project> ProjNo1 ProjNo2 ProjNo3 </project> </company> </in_xml> ProjNo1 ProjNo2 ProjNo3 一个简单的XSLT应用于这个源,它编写另一个值为Project标记的XML。 输入xml中的项目标记有三行,可以是一行或多行。我正在寻找XSL

我有这样一个输入XML:

<in_xml>
 <company>
  <project>
    ProjNo1
    ProjNo2
    ProjNo3
  </project>
 </company>
</in_xml>

ProjNo1
ProjNo2
ProjNo3
一个简单的XSLT应用于这个源,它编写另一个值为Project标记的XML。 输入xml中的项目标记有三行,可以是一行或多行。我正在寻找XSLT只读取第一行的方法,以防有多行,并在输出xml中写入第一行。 当前的XSLT非常简单,因为它只读取项目标记并输出值,因此代码没有附加

问候


我已经添加了问题的答案,请参见下文@Maestro的答案

如果您对能够应用XSLT 2.0感到满意,以下内容可能会有所帮助:

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="text"/>
    <xsl:template match="//project/text()">
        <xsl:value-of select="tokenize(normalize-space(.),' ')[1]" />
    </xsl:template>
</xsl:stylesheet>
相反。如果必须选择第二个单词,则灵活性较低,但对于第一个单词,它工作正常

编辑

您询问了如何检索XSLT 1.0中的第一行—这里的问题是前导空格可能包含LF,因此您不能仅在第一个LF之前的子字符串。
以下内容可能可以改进,但效果良好:

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="text"/>
    <xsl:template match="//project/text()">
        <xsl:variable name="afterLeadingWS"
select="substring-after(., substring-before(.,substring-before(normalize-space(.), ' ')))"/>
        <xsl:choose>
            <xsl:when test="contains($afterLeadingWS, '&#xA;')">
                 <xsl:value-of select="substring-before($afterLeadingWS, '&#xA;')"/>
            </xsl:when>
            <xsl:otherwise>
                 <xsl:value-of select="$afterLeadingWS"/>
            </xsl:otherwise>
        </xsl:choose>
   </xsl:template>
</xsl:stylesheet>


说明:首先像以前一样获取第一个单词,然后确定第一个单词之前的空格,然后获取前导空格之后的所有内容,然后获取第一行,即LF字符之前的字符串。可能只是在前导空格中没有LF,因此使用了choose函数。

如果您很高兴能够应用XSLT 2.0,以下内容可能会有所帮助:

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="text"/>
    <xsl:template match="//project/text()">
        <xsl:value-of select="tokenize(normalize-space(.),' ')[1]" />
    </xsl:template>
</xsl:stylesheet>
相反。如果必须选择第二个单词,则灵活性较低,但对于第一个单词,它工作正常

编辑

您询问了如何检索XSLT 1.0中的第一行—这里的问题是前导空格可能包含LF,因此您不能仅在第一个LF之前的子字符串。
以下内容可能可以改进,但效果良好:

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="text"/>
    <xsl:template match="//project/text()">
        <xsl:variable name="afterLeadingWS"
select="substring-after(., substring-before(.,substring-before(normalize-space(.), ' ')))"/>
        <xsl:choose>
            <xsl:when test="contains($afterLeadingWS, '&#xA;')">
                 <xsl:value-of select="substring-before($afterLeadingWS, '&#xA;')"/>
            </xsl:when>
            <xsl:otherwise>
                 <xsl:value-of select="$afterLeadingWS"/>
            </xsl:otherwise>
        </xsl:choose>
   </xsl:template>
</xsl:stylesheet>


说明:首先像以前一样获取第一个单词,然后确定第一个单词之前的空格,然后获取前导空格之后的所有内容,然后获取第一行,即LF字符之前的字符串。可能只是在前导空格中没有LF,因此使用了choose函数。

首先感谢@Maestro抽出时间帮助我,谢谢你的帮助。 下面是我用来从带有CR的文本段落中获取第一行的代码:

<xsl:variable name="projNumber" select="ProjectNumber" />
    <xsl:variable name="crlf" select="'&#10;'" />
    <xsl:choose>
      <xsl:when test="contains($projNumber,$crlf)">
        <xsl:value-of select="substring-before($projNumber,$crlf)"/>
      </xsl:when>
      <xsl:otherwise>
        <xsl:value-of select="$projNumber"/>
      </xsl:otherwise>
    </xsl:choose>

这可以写为一个函数,但我不知道如何做,也许有人可以指导,但你去那里。我的一位同事建议的一个更好的方法是避开CR并直接在子字符串函数中使用它,这将首先避免所有这些变量。
再次感谢。

首先感谢@Maestro抽出时间帮助我,感谢你的帮助。 下面是我用来从带有CR的文本段落中获取第一行的代码:

<xsl:variable name="projNumber" select="ProjectNumber" />
    <xsl:variable name="crlf" select="'&#10;'" />
    <xsl:choose>
      <xsl:when test="contains($projNumber,$crlf)">
        <xsl:value-of select="substring-before($projNumber,$crlf)"/>
      </xsl:when>
      <xsl:otherwise>
        <xsl:value-of select="$projNumber"/>
      </xsl:otherwise>
    </xsl:choose>

这可以写为一个函数,但我不知道如何做,也许有人可以指导,但你去那里。我的一位同事建议的一个更好的方法是避开CR并直接在子字符串函数中使用它,这将首先避免所有这些变量。
再次感谢。

这是代码,现在是函数getFirstLine。
请注意所需的附加名称空间。
还要注意,这确实需要XSLT2.0(xsl:function在1.0中不可用)


这是代码,现在有一个函数getFirstLine。
请注意所需的附加名称空间。
还要注意,这确实需要XSLT2.0(xsl:function在1.0中不可用)



我想情况不是很好!必须坚持使用XSLT 1.0感谢您的关注。XSLT 1.0中存在normalize-space()。本文中的代码显示了它[link](),但我无法根据我的要求对其进行调整。请尝试Hi Maestro,首先感谢您花时间帮助我。我创建了以下XSLT:“code”它只输出第一行的第一个单词!!!规范化空格方法用空格替换了偶数CR/LF,因此它只给出第一句的第一个字母。我猜情况不太好!必须坚持使用XSLT 1.0感谢您的关注。XSLT 1.0中存在normalize-space()。本文中的代码显示了它[link](),但我无法根据我的要求对其进行调整。请尝试Hi Maestro,首先感谢您花时间帮助我。我创建了以下XSLT:“code”它只输出第一行的第一个单词!!!规范化空间方法将偶数CR/LF替换为一个空格,因此它只给出第一个句子的第一个字母。