xml - xslt编程时 'or'和 '|'有什么区别?

标签 xml xslt xpath operators

我最近一直在使用 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:ifxsl: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/

相关文章:

java - 如何使用 ximpleware 获取 XML 中的内部数组子元素

xml - 如何使用 awk 在多个文件中第一次匹配模式后插入多行

xml - 无法获取属性值或在 XQuery 中获取错误 XQDY0025

java - 计算简单 XPath 表达式时出现异常

c# - XML字符串反序列化为c#对象

c# - 检查扩展对象是否在 xslt 模板中定义

xml - 如何在外部文件中将转义字符声明为 DTD 实体并在 XML 文件中导入

css - 如何将背景图像应用于电子邮件模板中的表格列(Outlook 2007)

javascript - XPath 无法单击 Greasemonkey 脚本中的按钮

php - 无法使用 xPath + PHP 将 HTML 节点的 outerHTML 存储到变量中