我们有一个java Web应用程序,它有XSLT 1.0(Saxon 9.6 he)作为其处理的一部分。在进行XML转换之前,Java代码使用根标记下的一些额外信息填充输入XML。所以像这样:
<root>
<mainContentToProcess/>
<extraInfo>
<color>Black</color>
</extraInfo>
</root>
在XSL文件中,我们在全局参数中获取该信息,如下所示:
<xsl:param name="color" select="//extraInfo/color/text()"/>
问题是,有时可能无法在Java代码中输入此节点,或者该值为空字符串或为null。
假设我们在java中将color的值设置为空字符串。在XSL代码中,我打印出以下内容:
$color: ''
not($color): 'true' //expected false
not($color = ''): true //expected false
$color= '': false // expected true
$color!= '': false
我无法弄清楚如何检测它是否为空字符串。我错过了什么吗?上面的值不是我所期望的。谢谢!
Java代码:
element = doc.createElement(elementName);
element.appendChild(doc.createTextNode(elementContent));
parent.appendChild(element);
其中elementContent是空字符串。
答案 0 :(得分:1)
XPath表达式//extraInfo/color/text()
选择一个文本节点序列,如果没有选择节点,则该序列可以是空序列,在这种情况下not($color)
为真,作为空序列节点的布尔值是false
和否定true
。
答案 1 :(得分:1)
当你说你&#34;打印出来&#34;值,我假设您正在使用xsl:value-of,它将提供的值转换为字符串。现在,如果$ color是一个空序列,当路径表达式没有选择任何内容时就是这种情况,那么
$ color:&#39;&#39;
- 是的,string(())
是&#39;&#39;
not($ color):&#39; true&#39;
- 是的,boolean(())
为假,not(())
为真。
not($ color =&#39;&#39;):true
- 是的,(() = X)
始终为假(即使() = ()
为假)
$ color =&#39;&#39;:false - 是的,见上文
$ color!=&#39;&#39;:false
- 是的,() != X
总是假的
请记住,=和!=是存在运算符:如果A中有一个项目a而B中有一些项目b使A~B
为真,则a~b
为真。如果任一序列为空,则不存在关系所持有的项对,因此比较始终为假,给出明显的悖论,即如果AUTHOR不存在,则AUTHOR='Kay'
和AUTHOR!='Kay'
都是false(结果非常类似于SQL三值逻辑,尽管以不同的方式得到)。