如果未设置默认值,XSLT1.0中全局参数的值是多少?

如果未设置默认值,XSLT1.0中全局参数的值是多少?,xslt,xslt-1.0,saxon,Xslt,Xslt 1.0,Saxon,我们有一个JavaWeb应用程序,其中XSLT1.0(Saxon9.6He)是其处理的一部分。在XML转换发生之前,Java代码在输入XML的根标记下自己的标记中填充一些额外的信息。比如说: <root> <mainContentToProcess/> <extraInfo> <color>Black</color> </extraInfo> </root> <xs

我们有一个JavaWeb应用程序,其中XSLT1.0(Saxon9.6He)是其处理的一部分。在XML转换发生之前,Java代码在输入XML的根标记下自己的标记中填充一些额外的信息。比如说:

<root>
    <mainContentToProcess/>
    <extraInfo>
        <color>Black</color>
    </extraInfo>
</root>
<xsl:param name="color" select="//extraInfo/color/text()"/>
我不知道如何检测它是否是空字符串。我错过什么了吗?上面的值不是我所期望的。谢谢

Java代码:

element = doc.createElement(elementName);
element.appendChild(doc.createTextNode(elementContent));
parent.appendChild(element);

其中elementContent是一个空字符串。

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

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

$color:' -是,
字符串(())
是“”

不($color):“正确” -是,
boolean(())
为false,
not(())
为true

not($color=''):true -是,
(()=X)
始终为false(即使
()=()
为false)

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

$color!='':假的 -是的,
()!=X
始终为false


记住这一点是存在运算符:
A~B
如果A中有某个项目A,B中有某个项目B,使得
A~B
为真,则
A~B
为真。如果其中一个序列为空,则不会有一对关系保持不变的项,因此比较总是错误的,这就产生了一个明显的悖论,即如果作者不在,那么
AUTHOR='Kay'
AUTHOR!='Kay'
都是假的(这一结果与SQL三值逻辑非常相似,尽管是以不同的方式得出的)。

Saxon 9.6他是XSLT 2.0处理器。@MartinHonnen这不重要。Saxon9与XSLT1.0兼容:您能显示Java代码吗?我们需要看看您是否真的使用包含空字符串的文本节点构建(DOM?)树。或者您是否将
color
元素have
textContent
设置为空字符串?问题的标题:如果未设置默认值,XSLT 1.0中全局参数的值是多少?这似乎不恰当。您已经在select表达式中定义了一个默认值,它的计算结果为空序列。如果您没有定义默认值,那么“默认值”要么是零长度字符串,要么是空序列,具体取决于声明的类型。谢谢Martin!我想检查空字符串的一种更合适的方法是这样的:我通常建议不要尝试选择文本节点,而是使用
//extraInfo/color
选择元素节点。至于您现在的Java代码示例,它是XSLT/XPathoverDOM,我不知道Saxon如何处理这个问题,我希望空的DOM文本节点在Saxon使用的树中显示为XPath文本节点。我已经添加了saxon标记,也许@MichaelKay可以更详细地告诉您saxon如何包装和表示树中没有内容的DOM文本节点。文本节点的长度永远不会为零(作为特殊情况,在将它们附加到任何元素之前除外)。如果元素有空内容,则
/text()
选择空序列,而不是零长度文本节点。(避免使用
/text()的另一个原因)
@MichaelKay,是的,我同意XSLT/XPath数据模型中的文本节点,但是DOM文本节点可以在树中以零长度内容存在,例如Firefox、Chrome和Edge with XPath over DOM选择这样一个文本节点:,。针对不忠实于XDM数据模型的DOM评估XPath的处理器在如何操作上是可变的他们将DOM映射到XDM,例如DOM允许相邻的文本节点,在这种情况下,一些XPath处理器会很乐意在./text()的结果中为您提供两个单独的节点.Saxon的一般方法是将DOM视为有效的XDM实例,只要这种解释是可能的,这意味着例如将相邻的文本节点视为单个节点。这是处理DOM比其他树模型慢的原因之一,也是我总是告诉人们停止使用DOM的原因之一。
element = doc.createElement(elementName);
element.appendChild(doc.createTextNode(elementContent));
parent.appendChild(element);