Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xml 在特定属性中获取不同的值_Xml_Xpath_Distinct - Fatal编程技术网

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> &

我有以下XML代码:

<!-- 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()