带有数字函数的 XPath 1.0 谓词与 XSLT 输入中的所有非零值不匹配

问题描述 投票:0回答:1

我正在使用

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>
xpath xslt xslt-1.0 xpath-1.0 libxslt
1个回答
0
投票

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']

© www.soinside.com 2019 - 2024. All rights reserved.