2017-07-19 21 views
1

我有這種類型的XML文件:XPATH 1.0 - 如何獲得存在對一種類型的父元素的所有童裝元素

<Product> 
    <item1>...</item1> 
    <item2>...</item2> 
    <item3>...</item3> 
</Product> 
<Product> 
    <item1>...</item1> 
    <item2>...</item2> 
    <item4>...</item4> 
    <item5>...</item5> 
</Product> 
<Product> 
    <item1>...</item1> 
    <item6>...</item6> 
</Product> 

我想獲得母公司的所有獨特的兒童元素的列表鍵入「產品」,像這樣:

<item1>...</item1> 
<item2>...</item2> 
<item3>...</item3> 
<item4>...</item4> 
<item5>...</item5> 
<item6>...</item6> 

我不在乎什麼是下這些「項目」的元素,我只是想列出可以在所有的「產品」存在的所有類型「項」元素我的文件的元素,如果可能的話使用XPATH 1.0。我只想顯示每個「item」元素,即使它們存在於幾個「Product」元素下。

我該怎麼做?感謝您的幫助 !

+0

您使用的是什麼環境? – Tomalak

+0

你想要一個xpath或xslt嗎? – derloopkat

+1

This [SO answer](https://stackoverflow.com/a/11107209/1377895)似乎解釋了列出不同值的XPath 1.0方式 –

回答

0

使用XPath 1.0版本,這將返回沒有重複的所有元素。

//Product/*[not(../preceding-sibling::Product/*/local-name()=local-name())] 

使用XPath 2.0版本,返回所有值,而無需重複。

distinct-values(//Product/*/local-name()) 
+0

您是否知道任何可以運行Xpath 2.0查詢的免費XML工具?我目前正在使用XML資源管理器;這是相當不錯的,但只支持Xpath 1.0 :( – JCD70

+0

我已經更新了我的回答,按照Roman Vottner提出的建議。根據https://www.w3.org/TR/xpath/ *之前的兄弟姐妹*應該支持版本1.另一方面,一旦我使用了.Net的Saxon開源實現,請參閱https://stackoverflow.com/questions/1525299/xpath-and-xslt-2-0-for-net – derloopkat

+0

Xpath v1.0代碼似乎不起作用,但是Xpath v2.0確實有效,我已經設法將它與Saxon HE命令行應用程序一起使用,謝謝! – JCD70

0

這XSLT的1.0做法一致Product元素的所有兒童,並通過檢查與同name/local-name一個節點在preceding-axis已經發生過濾它們。

<xsl:template match="//Product/*"> 
    <xsl:variable name="this" select="local-name()" /> 
    <xsl:if test="count(preceding::*[local-name()=$this]) = 0"> 
    Unique node: <xsl:value-of select="name()"/> 
    </xsl:if> 
</xsl:template> 
相關問題