我最近一直在使用 xslt,我一直无法理解 | 之间的区别。和或以及我什么时候应该使用哪个。我知道我可以只使用错误消息来确定我需要使用哪一个,但我有兴趣了解为什么我不能使用一个或另一个。
谁能帮我指出正确的方向,让我可以了解其中的区别?
最佳答案
|
关注的是节点,or
关注的是“真”,即 bool 值。
解释
|
或union
运算符
此运算符返回两个序列的并集,在本例中,这两个序列被解释为两组节点。一个有趣的细节是联合运算符会删除任何重复的节点。此外,它只接受 node()*
类型的操作数,即节点序列。节点按文档顺序返回。
or
运算符
此运算符的技术术语是 bool 析取。它有两个参数,这两个参数都必须分别计算为 bool 值(“true”或“false”)。或者,更准确地说, 或
的操作数通过将它们转换为 xs:boolean
来判断它们的有效 bool 值。顺便说一下,所有这些也适用于 和
运算符。
例子
使用 union
运算符扩大一组节点,通常在模板匹配中:
<xsl:template match="Root|Jon">
为什么不在这里使用或
操作符呢?因为 match
属性需要一组节点作为它的值。 union
返回一组节点,而 or
运算符返回 bool 值。您不能为 bool 值定义模板匹配。
在XSLT代码中使用or
操作符实现alternatives,主要使用xsl:if
或xsl:choose
:
<xsl:if test="$var lt 354 or $var gt 5647">
如果此 或
操作的两个操作数中的任何一个计算为 true
,则 xsl:if
的内容也将被计算.但不仅像“小于”(lt
) 这样的比较具有 bool 值,下面的比较也是完全合法的:
<xsl:if test="$var1 or $var2">
如果两个变量中至少有一个是非空序列,则以上表达式的计算结果仅为 true
。这是因为空序列被定义为具有 false
的有效 bool 值。
强制
请注意,由于 XSLT 将事物强制转换为适当类型的方式,因此在某些情况下可以使用任一运算符。考虑这两个条件:
<xsl:if test="Root | Jon"> ... <xsl:if>
<xsl:if test="Root or Jon"> ... <xsl:if>
第一个条件测试名为 Root
的子集和名为 Jon
的子集的并集是否非空。表达式 Root | Jon
返回一个节点序列,然后该序列被强制转换为一个 bool 值,因为 if
需要一个 bool 值;如果序列非空,则有效 bool 值为真。
第二个条件测试两组 child (名为 Root
的 child 和名为 Jon
的 child )中的任何一个是否为非空。表达式 Root or Jon
返回一个 bool 值,并且由于运算符 or
需要 bool 参数,所以这两个集合都被强制转换为 bool 值,然后 or
运算符被应用。
结果是相同的,但是(如您所见)这两个表达式以略有不同的方式达到该结果。
关于xml - xslt编程时 'or'和 '|'有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25407504/