You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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属性)。

可行解决方案

  1. 修改XPath谓词:将number(@original)改为number(@original) = 1或@original = '1',可得到预期结果。
  2. 改用遍历+条件判断:在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 15:19:54