2011-08-25 165 views
1

我试图执行XPATH查询,这将允许我根据两个条件选择节点。使用XPATH选择特定和唯一的属性

首先我需要包含独特属性的值,第二,我需要的是一个含有特定属性值节点的节点。

例如:

<rows> 
    <row value="0" id="130"/> 
    <row value="1" id="130"/> 
    <row value="2" id="130"/> 
    <row value="0" id="131"/> 
    <row value="1" id="131"/> 
    <row value="1" id="131"/> 
    <row value="2" id="131"/> 
    <row value="0" id="132"/> 
    <row value="1" id="132"/> 
    <row value="2" id="132"/> 
</rows> 

在这种情况下我想包含独特的“价值观”,但只有当他们也有ID =“131”的所有节点。我也想要第二个值='1'节点删除。我期待这个结果:

<row value="0" id="131"/> 
<row value="1" id="131"/> 
<row value="2" id="131"/> 

这是可能的一个XPATH查询吗?

谢谢。

+0

请在我的回答中看到我的评论。我的xpath中有一个错字。对于那个很抱歉。 –

回答

1

是的,但它不漂亮。可能有更好的方法,但这里有:

/rows/row[@id='131'][(not(preceding-sibling::row[@id='131']) or not(following-sibling::row[@id='131'])) or 
         preceding-sibling::row[@id='131']/@value != @value and 
         following-sibling::row[@id='131']/@value != @value] 

下面是一个在输入XML稍微复杂的版本上使用它的示例。 (我添加了另一个<row value="1" id="131"/>表明,它只返回唯一结果。)

输入XML:

<rows> 
    <row value="0" id="130"/> 
    <row value="0" id="131"/> 
    <row value="0" id="132"/> 
    <row value="1" id="130"/> 
    <row value="1" id="131"/> 
    <row value="1" id="132"/> 
    <row value="2" id="130"/> 
    <row value="2" id="131"/> 
    <row value="2" id="132"/> 
    <row value="1" id="131"/> 
</rows> 

结果:

<row value="0" id="131"/> 
<row value="1" id="131"/> 
<row value="2" id="131"/> 
+0

感谢DevNull的努力,但该查询仍然返回重复值。我想知道是否最好查询id,然后遍历结果并删除重复值? – adampetrie

+0

@adampetrie - 你用什么来执行查询?我在oXygen XML Editor中测试了它,它工作正常。 –

+0

我还使用Dimitre的XPath Visualizer对其进行了测试:http://www.huttar.net/dimitre/XPV/TopXML-XPV.html,并按预期工作。 –

0

当然,你可以使用<的xsl:key>元素和key()函数。构造一个键,它是一个< row>元素的@value和@id属性的组合,并且只选择那些包含一个节点并且其@id属性等于'131'(或其他)的'键集'。

<xsl:key name="id-key" match="row" use="concat(@value, '-', @id)" /> 

<xsl:template 
    match="row[count(key('id-key', concat(@value, '-', @id))) = 1 and @id='131']"> 
    <xsl:copy-of select="." /> 
</xsl:template> 

很好玩,不是吗?

了解更多关于在这里:​​http://www.jenitennison.com/xslt/grouping/muenchian.html

编辑:对不起,我只是意识到你需要一个XPath查询。注意自我:更仔细地阅读问题。然而,答案仍然有用,所以我会放弃它。