2012-05-23 34 views
1

我有两个变量,在我的XSLT 1.0模板,每个人拿着一个节点集(使用XPath选择)。我想确定一个变量中设置的节点是否包含在另一个变量中。例如,假设我有一个嵌套节的章节。我想看看$b包含在$a是否XPath的节点集包含另一个

<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"> 

添加一些上下文。我创建了HTML页面与此XSLT的树一个标签式界面,我试图解决的问题是把阶级=“当前”适当的标签。通过测试每个部分,看它是否是片区段的孩子,它得到了类=“电流”等标签将样式看起来好像是在上面。

回答

2

要扩大Michael Kay的不错的答案:

当一个节点$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) 
3

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

+0

谢谢您的回答。我为这个问题添加了一些背景,因为我很难解释。如果我只计算节点,在我看来,以下情况会造成混淆,因为每个父节点的子节点数量相同。我误解了吗?

A节
A.1节
B节
B.1节
Tim

+0

@Tim:你的主要问题是,你没在答案中不要尝试XPath表达式 - 如果你有做到这一点,你不会在评论中提出这样的问题。这个答案中的表达式是测试节点集包含的最直接(也是最短)的方式。你正试图寻找其他方法,他们可能在一种情况下工作,但不在另一种情况下工作 - 这可能不是花时间最有用的方式。欲了解更多信息,请阅读此处:http://www.dpawson.co.uk/xsl/sect2/muench.html#d9944e108。从我+1。 –

+0

@Dimitre,我没有*理解*答案。感谢你和迈克尔,我现在看到'|'是一个联合操作符,我认为它只是一个逻辑“或”。我已经提出了迈克尔的答案并接受了你的答案。我在学。对于我的特殊情况,我认为我的解决方案很好,但这不是我原来的问题的答案。 – Tim

0

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

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

虽然这是不使用的交集,它告诉$a是否包含$b

相关问题