2010-05-20 98 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(.))