'或'之间有什么区别?和' |'在xslt中编程时?

时间:2014-08-20 14:34:57

标签: xml xslt xpath operators

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

是否有人能帮助我指向正确的方向,以便我可以了解其中的差异?

2 个答案:

答案 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:ifxsl: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,则不评估第二个表达式。