获取元素引用单个XPath表达式中的其他两个元素

时间:2010-11-12 16:25:41

标签: xml xslt xpath

我需要获取一个包含引用其他两个元素的元素的节点集。我无法弄清楚如何在单个XPath表达式中完成它。

我的(简化)源XML看起来像这样:

<group>
   <id>1337</id>
</group>
<group>
   <id>1338</id>
</group>
<member>
   <id>31415</id>
   <groupId>1337</groupId>
</member>
<member>
   <id>31416</id>
   <groupId>1337</groupId>
</member>
<member>
   <id>31417</id
   <groupId>1338</groupId>
</member>

现在,我想选择所有引用恰好两个<group>的{​​{1}}个节点,这应该导致仅返回id = 1337的组。我试过以下......

<member>

......显然在'??'我需要在XPath表达式的开头插入我选择的组的groupId,但我想不出有办法到达这个groupId。任何人都可以想到一个吗?谢谢!

4 个答案:

答案 0 :(得分:2)

问题是谓词过滤了以前选定的节点,其中每个节点都是上下文。所以,你需要引入脱离上下文的引用。

这可以通过变量/参数引用或current()函数来完成(导致整个XSLT指令的上下文节点)。

此外,在这种情况下有交叉引用,最好使用密钥:

<xsl:key name="kMemberByGroupId" match="member" use="groupId"/>  
...
<xsl:variable name="groupsWithTwoMembers" 
              select="group[count(key('kMemberByGroupId',id)) = 2]"/>

答案 1 :(得分:1)

<强> XPath2.0

$p/group[count(index-of($p/member/groupId, id)) eq 2]

其中$p是提供的XML片段的父级。

答案 2 :(得分:0)

在XPath 1.0中,这是不可能的。在XPath 2.0中,您可以执行以下操作(未经测试):

for $a in fn:distinct-values(//group/id) 
  if count(../../member[@id = $a]) = 2 then return $a

答案 3 :(得分:0)

您应该研究当前节点和上下文节点之间的区别。它们通常是相同的,但在处理谓词时,上下文节点(通常用。表示)与您预测的节点相匹配。在这种情况下,您应该使用current()来访问当前节点而不是上下文节点。