XPath 1.0中使用number()函数的谓词未匹配所有非零值问题
XSLT中
number()作为XPath谓词时的异常输出问题 使用xsltproc执行XSLT时,尝试通过number(@original)将数值转换为布尔值(0视为false,其他值视为true),以此选中所有@original属性值非零的<rule>元素,但输出结果不符合预期。
复现案例
输入XML
<top> <constraint> <lifetime> <rule id="rule1" original="1"/> <rule id="rule2" original="1"/> </lifetime> </constraint> <constraint> <lifetime> <rule id="rule3" original="3"/> <rule id="rule4" original="0"/> <rule id="rule5"/> </lifetime> </constraint> </top>
XSLT样式表
<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="rule1" original="1"/> </item><item> <rule id="rule2" original="1"/> </item><item> <rule id="rule3" original="3"/> </item>
预期选中rule1、rule2、rule3(@original值非零),排除rule4(值为0)和rule5(无@original属性)。
可行解决方案
- 修改XPath谓词:将
number(@original)改为number(@original) = 1或@original = '1',可得到预期结果。 - 改用遍历+条件判断:在
for-each中遍历所有<rule>元素,内部用if判断number(@original),代码示例如下:
<xsl:for-each select="constraint/lifetime/rule"> <xsl:if test="number(@original)"> <item> <xsl:copy-of select="."/> </item> </xsl:if> </xsl:for-each>
内容的提问来源于stack exchange,提问作者narwahl
相关产品推荐
相关产品推荐

