xpath节点集是否包含另一个

时间:2012-05-23 20:29:31

标签: xpath xslt-1.0

我的xslt 1.0模板中有两个变量,每个变量都有一个节点集(用xpath选择)。我想确定一个变量中的节点集是否包含在另一个变量中的节点集中。例如,假设我有一章有嵌套部分。我想知道$b中是否包含$a

<xsl:variable name="a" select="chapter//section" />
<xsl:variable name="b" select="chapter//section" />

我试图获取节点集的交集,看看$a$a$b共享的第一个公共元素,但这不起作用:

<xsl:if test="$a/ancestor-or-self::*[count(.|$b) = count($b/ancestor::*)][1] = $a">

添加一些上下文。我正在使用这个xslt为html页面树创建一个选项卡式界面,而我正在尝试解决的问题是将class =“current”放在正确的选项卡上。通过测试每个部分以查看它是否是标签部分的子节点,它获得class =“current”,因此标签将被设置为看起来好像它在顶部。

3 个答案:

答案 0 :(得分:3)

我认为你可以简单地使用count($a) = count($a|$b)。如果$ b中的任何节点不在$ a中,则计数将不同。

答案 1 :(得分:2)

扩展Michael Kay的好答案:

当节点$n属于节点集$ns 时?

如果节点属于节点集,则节点与节点集的并集不会导致更大的节点集 - 因此,并集中节点的数量不能更大(在事实必须等于原始节点集中的节点数。

用XPath表达式表达

 count($n | $ns) = count($ns)

现在,同样的逻辑告诉我们,当两个节点集的并集不包含时,节点集$ns1恰好是节点集$ns2 的子集更大的节点集的更多元素:

count($ns1 | $ns2) = count($ns2)

如果我们想测试$ns1是否是<{1}} true 子集:

$ns2

答案 2 :(得分:0)

我能够使用不同的方法解决问题。我测试$b的每个祖先元素,看它是否具有与$a相同的xml:id:

<xsl:if test="boolean($b/ancestor-or-self::[@xml:id=$a/@xml:id])">

虽然这不使用交叉点,但它确实告诉我$a是否包含$b