Xml 在特定属性中获取不同的值
我有以下XML代码:Xml 在特定属性中获取不同的值,xml,xpath,distinct,Xml,Xpath,Distinct,我有以下XML代码: <!-- language: xml --> <Stats> <Stat> <Data Name="Value">63.76</Data> <Data Name="Entity">first</Data> </Stat> <Stat> <Data Name="Value">51.23</Data> &
<!-- language: 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>
63.76
第一
51.23
第二
46.1
第三
61.21
第一
我只想筛选“Data[@Name='Entity']所在的位置。使用xpath:/Stats/Stat/Data[@Name=“Entity”]
返回:
第一
第二
第三
首先
但我希望结果是独一无二的。所以我只得到:
第一
第二
第三
编辑:我需要这个来为xpath版本1.0工作。您需要说明xpath的哪个版本。在XPath 2.0中,它很简单:
distinct-values(/Stats/Stat/Data/@Name)
使用此XPath 1.0表达式:
/Stats/Stat
[Data/@Name='Entity'
and
not(Data[@Name='Entity'] = following-sibling::Stat/Data[@Name = 'Entity'])
]
/Data[@Name='Entity']
<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>
基于XSLT的验证:
/Stats/Stat
[Data/@Name='Entity'
and
not(Data[@Name='Entity'] = following-sibling::Stat/Data[@Name = 'Entity'])
]
/Data[@Name='Entity']
<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>
非常感谢。你说得对-对不起,我需要XPath1.0使用这个。顺便说一下,上面的代码没有给出期望的结果,因为它返回值和实体。将其更改为:distinct values(/Stats/Stat/Data[@Name='Entity])后,它就可以工作了——现在我需要将其转换为XPath 1.0版……太棒了!非常感谢您快速准确的回复。我找这个已经很久了。尤其是最后一个注释做到了这一点——XSLT是一个巨大的奖励@不客气。是的,XPath和XSLT都是迷人的、强大的、优雅的语言。那里的XML代码:63.76首先我的XML代码:63.76首先Bouke Groenescheij:我的答案有用吗?或者你还有什么问题吗?
/Stats/Stat
[Data/@Name='Entity'
and
not(Data[@Name='Entity'] = following-sibling::Stat/Data[@Name = 'Entity'])
]
/Data[@Name='Entity']
/text()