我的XML看起来如下所示。
<CONTAINER>
<SEARCHFOR />
<ITEM/>
<ITEM/>
<ITEM/>
<ITEM/>
<ITEM/>
<CONTAINER>
<SEARCHFOR />
<ITEM/>
<ITEM/>
<CONTAINER>
<SEARCHFOR />
<ITEM id="1" />
<ITEM/>
<ITEM/>
<CONTAINER>
<ITEM id="2" />
</CONTAINER>
</CONTAINER>
</CONTAINER>
</CONTAINER>
我正在寻找与ITEM节点最接近范围的SEARCHFOR节点。请看我的另一个问题,我在这里的意思。
Find nearest ancestor/sibling that matches criteria
我需要首先找到感兴趣的ITEM节点,然后从那里为SEARCHFOR节点进行处理。换句话说,// SEARCHFOR因为我的表达还不够。我有一个表达式,它将范围最近的SEARCHFOR节点定位到每个ITEM节点。这很好用,看起来像......
for $v in
//ITEM
return
($v/(ancestor::CONTAINER/SEARCHFOR|preceding-sibling::SEARCHFOR))[last()]
但是,结果列表并不是唯一的。我收到11个结果,每个ITEM节点按预期结果一个。我想要一个只包含3个项目的独特结果集。我在这里看到过在XSL中使用分组的建议,但我不能用我正在使用的工具来做这个,但我可以使用XPath 2.0语法。我也看到使用normalize-space()来获得独特的结果,但我的XML没有任何文本。我的唯一性需要由每个节点的绝对路径决定。
感谢您的帮助, 迈克尔
答案 0 :(得分:1)
只选择您感兴趣的那些ITEM元素(即具有SEARCHFOR的元素):ITEM[
(ancestor::CONTAINER/SEARCHFOR|preceding-sibling::SEARCHFOR)[last()]
]/(ancestor::CONTAINER/SEARCHFOR|preceding-sibling::SEARCHFOR)[last()]
。或者只是向您所拥有的内容添加步骤/.
,例如(for $v in
//ITEM
,这应该消除任何重复。
return
($v/(ancestor::CONTAINER/SEARCHFOR|preceding-sibling::SEARCHFOR))[last()])/.