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

What is the value of a global param in XSLT 1.0 if no default is set?

我们有一个 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 中将颜色的值设置为空字符串。在 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 为空字符串。

XPath 表达式//extraInfo/color/text() 选择一个文本节点序列,如果没有选择节点,该序列可以是一个空序列,在这种情况下 not($color) 为真,因为空序列的布尔值节点数是 false 和否定 true

当您说 "print out" 值时,我假设您使用的是 xsl:value-of,它将提供的值转换为字符串。现在如果 $color 是一个空序列,当路径表达式没有选择任何内容时似乎就是这种情况,那么

$颜色:'' - 是的,string(()) 是 ''

不是($color):'true' - 是的,boolean(()) 为假,not(()) 为真。

不是($color = ''):是的 - 是的,(() = X) 总是假的(甚至 () = () 也是假的)

$color='': 假 - 是的,见上文

$color!= '': 错误 - 是的,() != X 总是 false

请记住 = 和 != 是存在性运算符:如果 A 中有某项 a 且 B 中有某项 b 使得 a~b 为真,则 A~B 为真。如果任一序列为空,则不存在关系成立的项目对,因此比较始终为假,给出明显的悖论,如果 AUTHOR 不存在,则 AUTHOR='Kay'AUTHOR!='Kay' 都是false(结果与 SQL 三值逻辑非常相似,尽管以不同的方式得出)。