获取特定属性内的不同值 [英] Get distinct values within specific attributes

查看:72
本文介绍了获取特定属性内的不同值的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有以下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>

我只想过滤 Data [@ Name ='Entity]的位置。使用xpath: / Stats / Stat / Data [@ Name = Entity] 返回:
第一
第二
第三
首先

I want to filter only where 'Data[@Name='Entity']. Using xpath: /Stats/Stat/Data[@Name="Entity"] returns: first second third first

但是我希望结果是唯一的。所以我只能得到:
首先
第二
第三

But I want the results to be unique. So I only get: first second third

编辑:我需要使用它来处理xpath版本1.0。

I need this to work for xpath version 1.0.

推荐答案

使用此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>

注意:如果只需要文本节点(第一个 第二和第三),只需使用以下单个XPath表达式即可:

Note: If you just need the text nodes ("first", "second" and "third"), just use this single XPath expression:

/Stats/Stat
   [Data/@Name='Entity'
  and
   not(Data[@Name='Entity']  = following-sibling::Stat/Data[@Name = 'Entity'])
   ]
    /Data[@Name='Entity']
      /text()

这篇关于获取特定属性内的不同值的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆