2

我的 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",因此选项卡将被设置为看起来好像它在顶部。

4

3 回答 3

4

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

于 2012-05-23T21:37:08.243 回答
2

扩展迈克尔凯的好答案:

当一个节点$n属于一个节点集$ns

如果一个节点属于一个节点集,那么该节点与该节点集的并集不会导致更大的节点集——因此并集中的节点数不能更大(实际上必须是等于)比原始节点集中的节点数。

要使用 XPath 表达式表达这一点

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

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

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

如果我们想测试是否$ns1是 的真正子集$ns2

    count($ns1 | $ns2) = count($ns2)
   and
    count($ns2) > count(ns1)  
于 2012-05-25T02:14:54.103 回答
1

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

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

虽然这没有使用交集,但它确实告诉是否$a包含$b

于 2012-05-24T19:23:55.377 回答