比较前面的元素时抛出错误
Throwing error in comparing preceding element
我有以下 XML.
<body>
<para>
<phrase>[1.001]</phrase> Arrest is for the pu</para>
<para>
<phrase>[1.002]</phrase> Brandon J said in
</para>
<para>
<phrase>[1.001]</phrase> Singapore used to be and is still
</para>
</body>
以及下面的 XSLT
<xsl:template name="para" match="para">
<xsl:apply-templates select="./node()[1][self::page]" mode="first"/>
<div>
<xsl:choose>
<xsl:when test="./@align">
<xsl:attribute name="class"><xsl:text>para align-</xsl:text><xsl:value-of select="./@align"/></xsl:attribute>
</xsl:when>
<xsl:otherwise>
<xsl:attribute name="class"><xsl:text>para</xsl:text></xsl:attribute>
</xsl:otherwise>
</xsl:choose>
<xsl:apply-templates/>
</div>
</xsl:template>
<xsl:template name="phrase" match="phrase">
<span class="phrase">
<xsl:analyze-string select="." regex="\[([0-9]+)\.([0-9]+)\]">
<xsl:matching-substring>
<xsl:choose>
<xsl:when test="preceding::phrase[contains(., current())]">
<a name="{concat('CP',format-number(number(regex-group(1)),'0'),'-',format-number(number(regex-group(2)),'000'))}">
<xsl:value-of select="."/>
</a>
</xsl:when>
<xsl:otherwise>
<a name="{concat('P',format-number(number(regex-group(1)),'0'),'-',format-number(number(regex-group(2)),'000'))}">
<xsl:value-of select="."/>
</a>
</xsl:otherwise>
</xsl:choose>
<a name="{concat('P',format-number(number(regex-group(1)),'0'),'-',format-number(number(regex-group(2)),'000'))}">
</a>
</xsl:matching-substring>
<xsl:non-matching-substring>
<xsl:value-of select="."/>
</xsl:non-matching-substring>
</xsl:analyze-string>
</span>
</xsl:template>
我在这里尝试将 phrase
与 preceding phrase
中的任何一个进行匹配,结果出现以下错误。
Error on line 41
XPTY0020: Required item type of the context item for the preceding axis is node();
supplied value has item type xs:string
这里我无法理解什么是XPTY:0020
,为什么会出现这个错误。
请告诉我如何修复它。
这是 working Demo
谢谢
您需要使用一个变量:
<xsl:template name="phrase" match="phrase">
<xsl:variable name="this-phrase" select="."/>
<span class="phrase">
<xsl:analyze-string select="." regex="\[([0-9]+)\.([0-9]+)\]">
<xsl:matching-substring>
<xsl:choose>
<xsl:when test="$this-phrase/preceding::phrase[contains(., current())]">
显然 current()
的使用也可能不是您想要的,具体取决于您要比较的值。
我有以下 XML.
<body>
<para>
<phrase>[1.001]</phrase> Arrest is for the pu</para>
<para>
<phrase>[1.002]</phrase> Brandon J said in
</para>
<para>
<phrase>[1.001]</phrase> Singapore used to be and is still
</para>
</body>
以及下面的 XSLT
<xsl:template name="para" match="para">
<xsl:apply-templates select="./node()[1][self::page]" mode="first"/>
<div>
<xsl:choose>
<xsl:when test="./@align">
<xsl:attribute name="class"><xsl:text>para align-</xsl:text><xsl:value-of select="./@align"/></xsl:attribute>
</xsl:when>
<xsl:otherwise>
<xsl:attribute name="class"><xsl:text>para</xsl:text></xsl:attribute>
</xsl:otherwise>
</xsl:choose>
<xsl:apply-templates/>
</div>
</xsl:template>
<xsl:template name="phrase" match="phrase">
<span class="phrase">
<xsl:analyze-string select="." regex="\[([0-9]+)\.([0-9]+)\]">
<xsl:matching-substring>
<xsl:choose>
<xsl:when test="preceding::phrase[contains(., current())]">
<a name="{concat('CP',format-number(number(regex-group(1)),'0'),'-',format-number(number(regex-group(2)),'000'))}">
<xsl:value-of select="."/>
</a>
</xsl:when>
<xsl:otherwise>
<a name="{concat('P',format-number(number(regex-group(1)),'0'),'-',format-number(number(regex-group(2)),'000'))}">
<xsl:value-of select="."/>
</a>
</xsl:otherwise>
</xsl:choose>
<a name="{concat('P',format-number(number(regex-group(1)),'0'),'-',format-number(number(regex-group(2)),'000'))}">
</a>
</xsl:matching-substring>
<xsl:non-matching-substring>
<xsl:value-of select="."/>
</xsl:non-matching-substring>
</xsl:analyze-string>
</span>
</xsl:template>
我在这里尝试将 phrase
与 preceding phrase
中的任何一个进行匹配,结果出现以下错误。
Error on line 41
XPTY0020: Required item type of the context item for the preceding axis is node();
supplied value has item type xs:string
这里我无法理解什么是XPTY:0020
,为什么会出现这个错误。
请告诉我如何修复它。 这是 working Demo 谢谢
您需要使用一个变量:
<xsl:template name="phrase" match="phrase">
<xsl:variable name="this-phrase" select="."/>
<span class="phrase">
<xsl:analyze-string select="." regex="\[([0-9]+)\.([0-9]+)\]">
<xsl:matching-substring>
<xsl:choose>
<xsl:when test="$this-phrase/preceding::phrase[contains(., current())]">
显然 current()
的使用也可能不是您想要的,具体取决于您要比较的值。