2015-08-19 66 views
0

我是XPath和XML的新手。我想知道是否有一個XPath表達式來選擇整個XML文檔中的所有屬性名稱及其各自的值。XPath從整個XML文檔中選擇所有屬性名稱值對

作爲一個簡單的例子我有什麼:

<bookstore> 
    <book category="COOKING"> 
     <title lang="en">Everyday Italian</title> 
     <author>Giada De Laurentiis</author> 
     <year>2005</year> 
     <price>30.00</price> 
      <money currency="Dollars"></money> 
    </book> 
    <book category="CHILDREN"> 
     <title lang="en">Harry Potter</title> 
     <author>J K. Rowling</author> 
     <year>2005</year> 
     <price>29.99</price> 
      <money currency="Dollars"></money> 
    </book> 
    <book category="WEB"> 
     <title lang="en">XQuery Kick Start</title> 
     <author>James McGovern</author> 
     <author>Per Bothner</author> 
     <author>Kurt Cagle</author> 
     <author>James Linn</author> 
     <author>Vaidyanathan Nagarajan</author> 
     <year>2003</year> 
     <price>49.99</price> 
      <money currency="Euros"></money> 
    </book> 
     <book category="WEB"> 
     <title lang="en">Learning XML</title> 
     <author>Erik T. Ray</author> 
     <year>2003</year> 
     <price>39.95</price> 
      <money currency="Dollars"></money> 
    </book> 
</bookstore> 

我想這樣:

category : COOKING 
lang : en 
currency : Dollars 

category : CHILDREN 
lang : en 
currency : Dollars 

category : WEB 
lang : en 
currency : Euros 

category : WEB 
lang : en 
currency : Dollars 

的事情是我想這個表達式爲任何XML文檔的工作。對於我如何做到這一點的任何其他建議也是受歡迎的。謝謝。

+1

這是可能的..請提供一個示例輸入和預期輸出。 –

+1

嚴格來說,屬性值不是一個節點,不能由XPath表達式選擇。但是使用XSLT輸出名稱/值對列表當然是可能的。向我們展示(至少)預期產出。 –

+0

我提供了一個更簡單的例子。我的文件很大,但目標是一樣的。謝謝。 – pseudorandom

回答

1

這會爲你的輸入工作(您解決不匹配的標籤<money></currency>了!)等相當類似XML文件 - 但它不能保證與工作的任何 XML文檔:

XSLT 1.0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="text" encoding="UTF-8"/> 
<xsl:strip-space elements="*"/> 

<xsl:template match="/*/*"> 
    <xsl:for-each select=".//@*"> 
     <xsl:value-of select="concat(name(), ': ', ., '&#10;')"/> 
    </xsl:for-each> 
    <xsl:text>&#10;</xsl:text> 
</xsl:template> 

</xsl:stylesheet> 

OTOH,這工作的Wi TH任何XML - 但輸出將是所有屬性名稱/值對在整個文檔中,沒有分離只是一個單一的列表:

XSLT 1.0

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

<xsl:template match="/"> 
    <xsl:for-each select="//@*"> 
     <xsl:value-of select="concat(name(), ': ', ., '&#10;')"/> 
    </xsl:for-each> 
</xsl:template> 

</xsl:stylesheet> 

結果

category: COOKING 
lang: en 
currency: Dollars 
category: CHILDREN 
lang: en 
currency: Dollars 
category: WEB 
lang: en 
currency: Euros 
category: WEB 
lang: en 
currency: Dollars 
+0

謝謝!我解決了不匹配問題。 – pseudorandom

+0

@pseudorandom如果您的問題得到解答,請通過接受答案關閉它。 –

+0

我以前從未使用過XLST。你如何運行它?非常感謝你。我感謝你的幫助。 – pseudorandom

相關問題