我最近一直在使用xslt,而且我一直无法理解|之间的区别和或当我应该使用哪个。我知道我可以使用错误消息来确定我需要使用哪一个,但我有兴趣了解为什么我不能使用其中一个。
是否有人能帮助我指向正确的方向,以便我可以了解其中的差异?
答案 0 :(得分:7)
|
关注节点,or
关注"真实",即布尔值。
|
或union
运算符
此运算符返回两个序列的 union ,在这种情况下,它们被解释为两组节点。一个有趣的细节是union运算符删除任何重复的节点。此外,它只接受node()*
类型的操作数,即一系列节点。节点按文档顺序返回。
or
运算符
此运算符的技术术语是 Boolean Disjunction 。它需要两个参数,这两个参数必须分别评估为布尔值(" true"或" false")。或者,更确切地说,or
的操作数通过将它们转换为xs:boolean
来实现其有效布尔值。顺便说一下,所有这些也适用于and
运算符。
使用union
运算符放大一组节点,通常在模板匹配中:
<xsl:template match="Root|Jon">
为什么不在这里使用or
运算符?因为match
属性需要一组节点作为其值。 union
返回一组节点,而or
运算符返回一个布尔值。您无法为布尔值定义模板匹配。
使用or
运算符在XSLT代码中实现替代,主要使用xsl:if
或xsl:choose
:
<xsl:if test="$var lt 354 or $var gt 5647">
如果此or
操作的两个操作数中的任何一个评估为true
,那么xsl:if
的内容也将被评估。但不仅仅是比较&#34;小于&#34; (lt
)有一个布尔值,以下也是完全合法的:
<xsl:if test="$var1 or $var2">
如果两个变量中至少有一个是非空序列,则上述表达式仅计算true
。这是因为空序列被定义为具有有效布尔值false
。
请注意,由于XSLT将内容强制转换为适当的类型,因此有一些上下文可以使用任一运算符。考虑这两个条件:
<xsl:if test="Root | Jon"> ... <xsl:if>
<xsl:if test="Root or Jon"> ... <xsl:if>
第一个条件测试名为Root
的子集和名为Jon
的子集的并集是否为非空。表达式Root | Jon
返回一个节点序列,然后该序列被强制转换为布尔值,因为if
需要一个布尔值;如果序列非空,则有效布尔值为真。
第二个条件测试两个子集(名为Root
的子项和名为Jon
的子项)中的任何一个是否为非空。表达式Root or Jon
返回一个布尔值,并且由于运算符or
需要布尔参数,因此两个集合都被强制为布尔值,然后应用or
运算符。
结果是一样的,但(如你所见)这两个表达式以微妙的不同方式达到了这个结果。
答案 1 :(得分:1)
来自文档
|
- 联盟运营商。例如,元素<xsl:template match="a|b">
中的匹配属性匹配所有<a>
和<b>
元素
or
- 测试第一个或第二个表达式是true
。如果第一个表达式是true
,则不评估第二个表达式。