|
关注节点,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.
第二个条件测试是否两个子集(名为Root
children且名为children的子集Jon
)中的任何一个都是非空的.表达式Root or Jon
返回一个布尔值,并且由于运算符or
需要布尔参数,因此两个集合都被强制为布尔值,然后or
应用运算符.
结果是一样的,但(如你所见)这两个表达式以微妙的不同方式达到了这个结果.
来自文档
|
- 联合操作员。例如元素中的match属性<xsl:template match="a|b">
匹配所有<a>
和<b>
元素
or
- 测试第一个或第二个表达式是否为true
。如果第一个表达式为true
,则不计算第二个表达式。