我的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”,因此标签将被设置为看起来好像它在顶部。
答案 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
。