抛出错误前的子字符串

Substring before throwing error

我有以下XML

<?xml version="1.0" encoding="UTF-8"?>
<body>
 <p>Industrial drawing: Any creative composition</p>
   <p>Industrial drawing: Any creative<fn>
          <fnn>4</fnn>
          <fnt>
            <p>ftn1"</p>
          </fnt>
        </fn> composition
      </p>
</body>

和下面的 XSL。

<xsl:template match="p">
    <xsl:choose>
        <xsl:when test="contains(substring-before(./text(),' '),'Article')">
            <xsl:text>sect3</xsl:text>
            <xsl:value-of select="./text()"/>
        </xsl:when>
        <xsl:when test="contains(substring-before(./b/text(),' '),'Section')">
            <xsl:text> Sect 2</xsl:text>
            <xsl:value-of select="./text()"/>
        </xsl:when>
        <xsl:when test="contains(substring-before(./b/text(),' '),'Chapter')">
            <xsl:text> Sect 1</xsl:text>
            <xsl:value-of select="./text()"/>
        </xsl:when>
        <xsl:otherwise>

</xsl:otherwise>
    </xsl:choose>
</xsl:template>

我的 XSL 在 <p>Industrial drawing: Any creative composition</p> 下工作正常,但在下面的情况下

 <p>Industrial drawing: Any creative<fn>
      <fnn>4</fnn>
         <fnt>
            <p>ftn1"</p>
         </fnt>
      </fn> composition
 </p>

它向我抛出以下错误。

XSLT 2.0 Debugging Error: Error: file:///C:/Users/u0138039/Desktop/Proview/ASAK/DIFC/XSLT/tabel.xslt:38: Wrong occurrence to match required sequence type -   Details: -     XPTY0004: The supplied sequence ('2' item(s)) has the wrong occurrence to match the sequence type xs:string ('zero or one')

请告诉我如何解决这个问题并获取所需的文本。

谢谢

示例中的 p 元素有多个文本节点,因此表达式 ./text() 创建了一个序列。您不能将字符串函数应用于序列;您必须先将其转换为字符串。而不是:

test="contains(substring-before(./text(),' '),'Article')"

尝试:

test="contains(substring-before(string-join(text(), ''), ' '), 'Article')"

您的示例 XML 中的第二个 p 元素有 两个 个子文本节点,一个包含 "Industrial drawing: Any creative",另一个包含 space、"composition"、一个换行符和另外六个 space。在 XSLT 1.0 中,将需要字符串的函数应用于由多个节点组成的集合的参数是合法的,其行为是获取第一个节点的值并忽略所有其他节点。但是在 2.0 中,将两个节点传递给一个期望其参数具有单个值的函数是一个类型不匹配错误。

但在这种情况下,我怀疑您是否真的需要使用 text() - 如果您关心的只是查看字符串 "Article" 是否出现在 [= 下的第一个单词中的任何位置11=] (包括当它嵌套在另一个元素中时)那么你可以简单地使用 .:

<xsl:when test="contains(substring-before(.,' '),'Article')">

(或者更好的是,使用谓词将不同的条件分离到它们自己的模板中,一个模板匹配 "Article" 段,另一个匹配 "Section" 段,等等)