如果没有设置默认值,XSLT 1.0中全局参数的值是多少?

时间:2015-10-30 19:16:52

标签: xslt xslt-1.0 saxon

我们有一个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是空字符串。

2 个答案:

答案 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三值逻辑,尽管以不同的方式得到)。