如果没有foo节点存在,为什么“foo!= 1”在xslt中的行为与“not(foo = 1)”不同?

时间:2014-02-25 10:54:12

标签: xslt

我在XSLT中有这样的条件:

 <xsl:if test="foo != 1">
     <p>This should be shown if foo doesn't equal one</p>
 </xsl:if>

foo在这里是一面旗帜。如果foo为1或0,则表示正常。但是如果没有定义foo元素,则条件返回false,就好像foo等于1一样。

我已将其更改为

 <xsl:if test="not(foo = 1)">
     <p>This should be shown if foo doesn't equal one</p>
 </xsl:if>

它开始像我预期的那样工作:如果没有foo,条件也是如此。

有人可以解释为什么在XSLT中如此。检查节点是否存在以及没有特定值的最佳方法是什么?

2 个答案:

答案 0 :(得分:1)

你的第一个声明说:

if there is a foo element that is not 1

这是真的foo元素必须存在,否则即使根本没有foo元素也是如此

你的第二个声明说:

if there is no foo element that is 1 

这是做你想做的事的正确方法,因为如果根本没有foo元素也是如此

答案 1 :(得分:0)

使用以下输入

<?xml version="1.0" encoding="UTF-8"?>
<root>
    <test>
        <foo>1</foo>
    </test>
    <test>
        <foo>0</foo>
    </test>
    <test>
        <a>xxx</a>
    </test>    
</root>

和以下样式表

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" indent="yes"/>

    <xsl:template match="//test">
        <xsl:choose>
            <xsl:when test="not(foo[.!=1])">
                <p>aaa</p>
            </xsl:when>
            <xsl:otherwise>
                <p>bbb</p>
            </xsl:otherwise>
        </xsl:choose>
    </xsl:template>
</xsl:stylesheet>

输出

<?xml version="1.0" encoding="utf-8"?>

<p>aaa</p>

<p>bbb</p>

<p>aaa</p>