2013-11-20 132 views
1

我发现,虽然这个测试返回true:XSLT: “测试” 结果混乱

test="string-length(foo) = 0"

然而,出于某种原因,这两个测试都返回false:

test="foo = ''"

test="foo = null"

任何想法可能会发生什么?是否还有其他一些foo可能会导致长度为0的状态,但仍然不等于“'或null?

另外 - 如果我输出:

X<xsl:value-of select="foo" />X

outputs: XX

+1

见[http://stackoverflow.com/questions/825831/check-if-a-string-is-null-or-empty-in-xslt][1] [1]: http://stackoverflow.com/questions/825831/check-if-a-string-is-null-or-empty-in-xslt – nrathaus

+0

谢谢 - 我发现刚才那篇文章完全相同。具体来说,我的误解是假设not(foo)和foo = null会返回相同的结果,显然这是不正确的。如果该元素不存在,则不等于null。相反,测试丢失的元素必须用not(foo)进行测试。谢谢! – eejai42

+0

我猜在XSLT中没有_null_,请阅读Martin Honnen的回答。 – Fernando

回答

2

如果foo是一个空节点集,那么string(foo)是“”,并且string-length(foo)是零,但foo = ''是false。 XPath充满了惊喜。

解释是foo = ""并不意味着string(foo) = ""正如您所期望的那样,而是some $F in foo satisfies $F = ""(您可以在XPath 2.0中完整编写)。如果foo是空集,那么存在性测试显然是错误的。

+0

非常简洁。谢谢! – eejai42

1

那么,如果你做test="foo = null"你比较上下文节点上下文节点的null子元素(S)的foo子元素(一个或多个)。