2010-05-20 44 views
10

如何才能使用XPATH为XML文档选择不同的元素?我尝试使用“distinct-values”函数,但由于某种原因它不工作。如何使用XPATH从XML文档中选择不同的值?

XML与以下:

<catalog> 

<product> 
<size>12</size> 
<price>1000</price> 
<rating>1</rating> 
</product> 

<product> 
<size>10</size> 
<price>1000</price> 
<rating>1</rating> 
<year>2010</year> 
</product> 

</catalog> 

所以,我想是所有的产品elements.In给定的例子这将是不同的孩子的名单 - 尺寸,价格,等级,年份 我的XPath是这样的:不同-values(catalog/product/*)

+0

distinct-values函数仅用于一个值,内联内容或属性内容。您是指完全不同的孩子的意思吗?是不同的元素名称,如大小,价格,等级,而不是值? – Myra 2010-05-20 07:45:36

+0

对不起..耶,我想要得到所有不同的孩子元素名称列表 – Alex 2010-05-20 07:47:47

+0

你可能不会被XPath抓住不同的名字! – Myra 2010-05-20 07:58:03

回答

14

在XPath 2.0

distinct-values(/*/*/*/name(.)) 

在XPath 1.0这可以用一个单一的XPath表达式来产生不

使用XSLT 1.0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="text"/> 

<xsl:template match="/"> 
    <xsl:for-each select= 
    "/*/*/*[not(../following::*/* 
         [not(name() = name(current()))] 
       ) 
      ]"> 
    <xsl:value-of select="concat(name(), ' ')"/> 
    </xsl:for-each> 
</xsl:template> 
</xsl:stylesheet> 

当这个变换所提供的XML文档应用,有用结果产生

size price rating year 

一种更有效的XSLT 1.0转化,使用密钥

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="text"/> 

<xsl:key name="kpchildByName" 
    match="product/*" use="name()"/> 

<xsl:template match="/"> 
    <xsl:for-each select= 
    "/*/*/* 
     [generate-id() 
     = 
      generate-id(key('kpchildByName', name())[1]) 
      ]"> 
    <xsl:value-of select="concat(name(), ' ')"/> 
    </xsl:for-each> 
</xsl:template> 
</xsl:stylesheet> 
3

distinct-values()在XPath 2中可用0.0。你在用吗?

如果distinct-values()不可用,获取不同值的标准方法是使用not(@result = preceding:: @result)来获得唯一的@result。它只会给你第一次出现。

+1

我不知道我有哪些XPATH版本:)我怎样才能找到这个? – Alex 2010-05-20 07:53:37

+0

这只有在列表按结果排序时才有效 – Hazaart 2017-12-11 15:02:45

2

需要元素名称的不同值 - 是这样的:

distinct-values($catalog/product/*/name(.))