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

Jon*_*Jon 3 xml xslt xpath operators

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

是否有人能够帮我指出正确的方向到我可以学到区别的地方?

Mat*_*ler 7

|关注节点,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:ifxsl: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应用运算符.

结果是一样的,但(如你所见)这两个表达式以微妙的不同方式达到了这个结果.


Rom*_*yan 1

来自文档

|- 联合操作员。例如元素中的match属性<xsl:template match="a|b">匹配所有<a><b>元素

or- 测试第一个或第二个表达式是否为true。如果第一个表达式为true,则不计算第二个表达式。