Xml ';或';和'|';在xslt中编程时?

Xml ';或';和'|';在xslt中编程时?,xml,xslt,xpath,operators,Xml,Xslt,Xpath,Operators,我最近一直在使用xslt,我很难理解|和或与何时应该使用哪个之间的区别。我知道我可以使用错误消息来确定我需要使用哪一个,但我有兴趣了解为什么我不能使用其中一个 有没有人能帮我指出正确的方向,让我在某个地方了解不同之处?来自文档 |-联合运算符。例如,元素中的match属性匹配所有和元素 或-测试第一个或第二个表达式是否为真。如果第一个表达式是true,则第二个表达式不计算。|与节点有关,或与“true”(即布尔值)有关 解释 |或联合运算符 此运算符返回两个序列的并集,在本例中,这两个序列被解释

我最近一直在使用xslt,我很难理解|和或与何时应该使用哪个之间的区别。我知道我可以使用错误消息来确定我需要使用哪一个,但我有兴趣了解为什么我不能使用其中一个


有没有人能帮我指出正确的方向,让我在某个地方了解不同之处?

来自文档

|
-联合运算符。例如,元素
中的match属性匹配所有
元素


-测试第一个或第二个表达式是否为
。如果第一个表达式是
true
,则第二个表达式不计算。

|
与节点有关,
与“true”(即布尔值)有关

解释
|
联合
运算符

此运算符返回两个序列的并集,在本例中,这两个序列被解释为两组节点。一个有趣的细节是union操作符删除了所有重复的节点。此外,它只接受
节点()*
类型的操作数,即节点序列。节点按文档顺序返回

操作员
操作员

此运算符的技术术语是布尔析取。它需要两个参数,这两个参数都必须分别计算为布尔值(“true”或“false”)。或者,更准确地说,
的操作数通过将其转换为
xs:Boolean
来与有效的布尔值相加。顺便说一下,所有这些也适用于
操作符

例子 使用
union
操作符放大一组节点,通常在模板匹配中:

<xsl:template match="Root|Jon">
如果此
操作的两个操作数中的任何一个计算结果为
true
,则也将计算
xsl:If
的内容。但不仅像“小于”(
lt
)这样的比较有一个布尔值,以下内容也是完全合法的:

<xsl:if test="$var1 or $var2">
第一个条件测试名为
Root
的子集合和名为
Jon
的子集合的并集是否为非空。表达式
Root | Jon
返回一个节点序列,然后该序列被强制为布尔值,因为
if
需要一个布尔值;如果序列为非空,则有效布尔值为真

第二个条件测试两组子项(名为
Root
的子项和名为
Jon
的子项)是否为非空。表达式
Root或Jon
返回一个布尔值,由于运算符
需要布尔参数,因此这两个集合分别强制为布尔值,然后应用
运算符


结果是一样的,但是(正如你所看到的)这两种表达方式以微妙的不同方式达到了这个结果。

@C.M.Sperberg-McQueen感谢添加了关于胁迫的内容!我的回答肯定缺少这些信息。
<xsl:if test="$var1 or $var2">
<xsl:if test="Root | Jon"> ... <xsl:if>

<xsl:if test="Root or Jon"> ... <xsl:if>