使用节点(或类似)的绝对路径作为键获取唯一结果集

时间:2011-12-14 16:41:02

标签: xml xpath unique

我的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没有任何文本。我的唯一性需要由每个节点的绝对路径决定。

感谢您的帮助, 迈克尔

1 个答案:

答案 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()])/.
,这应该消除任何重复。