我需要获取一个包含引用其他两个元素的元素的节点集。我无法弄清楚如何在单个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。任何人都可以想到一个吗?谢谢!
答案 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()来访问当前节点而不是上下文节点。