|关注节点,or关注"真相",即布尔值.
该|或union运营商
这个运算符返回联合的是,在这种情况下,被解释为两组节点的两个序列的.一个有趣的细节是union运算符删除任何重复的节点.此外,它只接受该类型的操作数node()*,即节点序列.节点按文档顺序返回.
该or运营商
此运算符的技术术语是布尔值分离.它需要两个参数,这两个参数必须分别评估为布尔值("true"或"false").或者,更准确地说,是的操作数or由它们jugded 有效的布尔值,通过将它们转换为xs:boolean.and顺便说一下,所有这些也适用于操作员.
使用union运算符放大一组节点,通常在模板匹配中:
<xsl:template match="Root|Jon">
Run Code Online (Sandbox Code Playgroud)
为什么不在or这里使用运营商?因为该match属性需要一组节点作为其值.union返回一组节点,而or运算符返回一个布尔值.您无法为布尔值定义模板匹配.
使用or运算符在XSLT代码中实现替代,主要使用xsl:if或xsl:choose:
<xsl:if test="$var lt 354 or $var gt 5647">
Run Code Online (Sandbox Code Playgroud)
如果此or操作的两个操作数中的任何一个求值为true,则xsl:if也将评估内容.但是,不仅像"less than"(lt)这样的比较具有布尔值,以下也是完全合法的:
<xsl:if test="$var1 or $var2">
Run Code Online (Sandbox Code Playgroud)
上述表达式仅评估true两个变量中的至少一个是否为非空序列.这是因为空序列被定义为具有有效的布尔值false.
请注意,由于XSLT将事物强制转换为适当类型的方式,因此在某些上下文中可以使用任一运算符.考虑这两个条件:
<xsl:if test="Root | Jon"> ... <xsl:if>
<xsl:if test="Root or Jon"> ... <xsl:if>
Run Code Online (Sandbox Code Playgroud)
第一个条件测试是否命名Root的子集和名为的子集的并集Jon是非空的.表达式Root | Jon返回一个节点序列,然后该序列被强制转换为布尔值,因为if需要一个布尔值; 如果序列非空,则有效布尔值为true.
第二个条件测试是否两个子集(名为Rootchildren且名为children的子集Jon)中的任何一个都是非空的.表达式Root or Jon返回一个布尔值,并且由于运算符or需要布尔参数,因此两个集合都被强制为布尔值,然后or应用运算符.
结果是一样的,但(如你所见)这两个表达式以微妙的不同方式达到了这个结果.
来自文档
|- 联合操作员。例如元素中的match属性<xsl:template match="a|b">匹配所有<a>和<b>元素
or- 测试第一个或第二个表达式是否为true。如果第一个表达式为true,则不计算第二个表达式。