我的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> 
<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(),':')"/>
由于
答案 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]),':')"/>