我正在尝试执行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 :(得分: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查询。自我注意:更仔细地阅读问题。但是,答案仍然有用,所以我会离开它。