我正在使用
xsltproc
命令并使用 number()
函数从谓词获取意外输出。通过再现器来解释是最简单的。
复制者:
<top>
<constraint>
<lifetime>
<rule id="rule1" original="1"/>
<rule id="rule2" original="1"/>
</lifetime>
</constraint>
<constraint>
<lifetime>
<rule id="rule3" original="1"/>
<rule id="rule4" original="1"/>
</lifetime>
</constraint>
</top>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:strip-space elements="*"/>
<xsl:output encoding="UTF-8" indent="yes" omit-xml-declaration="yes"/>
<xsl:template match="/|@*|node()" name="identity">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="top">
<xsl:for-each select="constraint/lifetime/rule[number(@original)]">
<item>
<xsl:copy-of select="."/>
</item>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
<item>
<rule id="rule1" original="1"/>
</item><item>
<rule id="rule3" original="1"/>
</item>
<item>
<rule id="rule1" original="1"/>
</item><item>
<rule id="rule2" original="1"/>
</item><item>
<rule id="rule3" original="1"/>
</item><item>
<rule id="rule4" original="1"/>
</item>
如果我从
number(@original)
更改为 number(@original) = 1
或 @original = '1'
,我会得到预期的结果。如果我在 if
中使用 for-each
而不是使用 XPath 谓词,我也会得到预期的结果:
<xsl:for-each select="constraint/lifetime/rule">
<xsl:if test="number(@original)">
<item>
<xsl:copy-of select="."/>
</item>
</xsl:if>
</xsl:for-each>
number(@original)
始终在您的情况下返回 1
。 IE。 XPath constraint/lifetime/rule[number(@original)]
表示 constraint/lifetime/rule[1]
,即元素 rule
中的第一个元素 lifetime
。
如果你想检查
@original
是数字,那么你需要使用这个条件:
constraint/lifetime/rule[number(@original) = @original]
或者
constraint/lifetime/rule[string(number(@original)) != 'NaN']