抛出错误之前的子串

时间:2015-06-10 12:47:41

标签: xslt xslt-2.0

我有以下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')

请让我知道如何解决此问题并获取所需的文字。

由于

2 个答案:

答案 0 :(得分:2)

示例XML中的第二个p元素包含两个子文本节点,一个包含“工业图纸:任何广告素材”,另一个包含空格,“合成”,换行符另外六个空格。在XSLT 1.0中,将字符串应用于一个由多个节点组成的参数的函数是合法的,行为是获取第一个节点的值而忽略所有其他节点。但是在2.0中,将两个节点传递给期望其参数的单个值的函数是一种类型不匹配错误。

但是在这种情况下,我怀疑你真的需要使用text() - 如果您关心的是查看字符串“Article”是否出现在p下的第一个单词内的任何位置(包括何时嵌套在另一个元素中)然后你可以简单地使用.

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

(或者更好的是,使用谓词将不同的条件分成他们自己的模板,一个模板匹配“Article”段落,另一个匹配的“Section”段落等。)

答案 1 :(得分:1)

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

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

尝试:

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