次の XPath 1.0 式を使用します。
/Stats/Stat
[Data/@Name='Entity'
and
not(Data[@Name='Entity'] = following-sibling::Stat/Data[@Name = 'Entity'])
]
/Data[@Name='Entity']
XSLT ベースの検証:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="/">
<xsl:copy-of select=
"/Stats/Stat
[Data/@Name='Entity'
and
not(Data[@Name='Entity'] = following-sibling::Stat/Data[@Name = 'Entity'])
]
/Data[@Name='Entity']
"/>
</xsl:template>
</xsl:stylesheet>
この変換が次の XML ドキュメントに適用された場合(整形式でない提供されたテキストを修正することによって生成されます):
<Stats>
<Stat>
<Data Name="Value">63.76</Data>
<Data Name="Entity">first</Data>
</Stat>
<Stat>
<Data Name="Value">51.23</Data>
<Data Name="Entity">second</Data>
</Stat>
<Stat>
<Data Name="Value">46.1</Data>
<Data Name="Entity">third</Data>
</Stat>
<Stat>
<Data Name="Value">61.21</Data>
<Data Name="Entity">first</Data>
</Stat>
</Stats>
上記の XPath 式が評価され、選択されたノードが出力にコピーされます。
<Data Name="Entity">second</Data>
<Data Name="Entity">third</Data>
<Data Name="Entity">first</Data>
注: テキスト ノード (「first」、「second」、および「third」) だけが必要な場合は、次の 1 つの XPath 式を使用します。
/Stats/Stat
[Data/@Name='Entity'
and
not(Data[@Name='Entity'] = following-sibling::Stat/Data[@Name = 'Entity'])
]
/Data[@Name='Entity']
/text()