版本更改错误

时间:2014-02-27 12:30:35

标签: xml xslt xslt-2.0

我的XML中有以下行。

<part>
<title>P<content-style format="smallcaps">ART</content-style> 1: CONSTITUTION OF COMPANY</title>
<part>

并且使用下面的XSLT我正在尝试检索数字(这里是1)。

<xsl:template match="part">
    <xsl:apply-templates select="title"/>
     <section class="tr_chapter">
            <div class="chapter">
                <xsl:variable name="num_L">
                    <xsl:value-of select="string-length(substring-before(./title,':'))"></xsl:value-of>
                </xsl:variable>
                <xsl:variable name="num_S">
                    <xsl:choose>
                        <xsl:when test="$num_L=1">
                            <xsl:value-of select="concat('0',substring-before(./title/text(),':'))"/>
                        </xsl:when>
                        <xsl:otherwise>
                            <xsl:value-of select="substring-before(./title/text(),':')"/>
                        </xsl:otherwise>
                    </xsl:choose>

                </xsl:variable>
                <a name="CLI_CH_{$num_S}"/>

                <xsl:variable name="cnum">
                    <xsl:choose>

                        <xsl:when test="starts-with(@num,'0')">
                            <xsl:value-of select="substring-after(@num,'0')"/>
                        </xsl:when>
                        <xsl:otherwise>
                            <xsl:value-of select="@num"/>
                        </xsl:otherwise>
                    </xsl:choose>
                </xsl:variable>
                <div class="chapter-title">
                    <span class="chapter-num">
                        <xsl:value-of select="normalize-space(concat('Chapter ',$cnum,' '))"/>
                    </span>&#x00A0;
                    <xsl:variable name="TiC">
                        <xsl:call-template name="TitleCase">
                            <xsl:with-param name="text" select="translate(normalize-space(title),'ABCDEFGHIJKLMNOPQRSTUVWXYZ','abcdefghijklmnopqrstuvwxyz')" />
                        </xsl:call-template>
                    </xsl:variable>
                    <!--<xsl:apply-templates select="$TiC"/>-->
                    <xsl:value-of select="title"/>
                </div>              
                <xsl:apply-templates select="child::node()[not(self::title)]"/>

            </div>
        </section>
    <xsl:apply-templates select="//chapter"/>
</xsl:template>

当我运行它时,它会抛出一些错误。哪些用于在XSLT 1.0中工作,请让我知道为什么会出现此错误以及如何纠正它。

XSLT 2.0 Debugging Error: Error: file:///C:/Users/u0138039/Desktop/Proview/HK/In%20Progress/Company_Law_Practice_&_Procedure_xml/XSLT/CLI_CHAP.xsl:65: 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')

我也尝试过以下声明,但结果没有变化。

 <xsl:value-of select="./title/substring-before(text(),':')"/>

由于

2 个答案:

答案 0 :(得分:1)

你几乎肯定需要在这里使用text(),因为你似乎关心的是title元素的完整字符串值。

text()为您提供了一个序列,其中包含所讨论元素的直接子节点的所有文本节点,因此./title/text()两个文本节点的序列,一个值为P,另一个值为1: CONSTITUTION OF COMPANY(前面有空格)。在XSLT 1.0中,当您在上下文中提供一组需要单个字符串的多个节点时,您获得的是文档顺序中集合中第一个节点的字符串值(所以只有“P”)这个例子)。但是XSLT 2.0更严格 - substring-before期望它的第一个参数是单个值,如果你给它一个两个值的序列,它会抱怨。

如果您只使用substring-before(./title,':')而不使用/text()那么它应该做正确的事情,因为这将对整个title元素的字符串值进行操作,这是串联的所有后代(非子)文本节点,即PART 1: CONSTITUTION OF COMPANY

答案 1 :(得分:1)

你可以使用

<xsl:value-of select="substring-before(normalize-space(./title/child::text()[2]),':')"/>