使用XPATH选择特定和唯一属性

时间:2011-08-25 18:46:35

标签: xml 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查询是否可以实现?

感谢。

2 个答案:

答案 0 :(得分: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"/>

答案 1 :(得分:0)

当然,您可以使用&lt; xsl:key&gt; element和key()函数。构造一个键,它是&lt; row&gt;的@value和@id属性的组合。 element,并仅选择那些包含一个节点且其@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查询。自我注意:更仔细地阅读问题。但是,答案仍然有用,所以我会离开它。