2014-02-06 373 views
1

我正在嘗試使用XSLT處理XML文件,以生成一個列表或表(或最終)帶有一些值的SQL INSERT命令。我一直在使用w3schools http://www.w3schools.com/xsl/tryxslt.asp?xmlfile=cdcatalog&xsltfile=cdcatalog的例子。如何使用XSLT處理名稱空間XML文檔?

我的XML是非常簡單的,我需要提取只是名字和酒店的速度:

<?xml version="1.0" encoding="utf-8"?> 
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <soapenv:Body> 
    <getHotelsResponse xmlns="http://hotel.booking.vbooking.com"> 
     <getHotelsReturn> 
     <address> 
      <number>589-591</number> 
      <postcode>08014</postcode> 
      <region>Catalonia</region> 
      <street>Carrer Vermell</street> 
      <town>Barcelona</town> 
     </address> 
     <name>Downtown Hotel</name> 
     <rate>235.0</rate> 
     </getHotelsReturn> 
    </getHotelsResponse> 
    </soapenv:Body> 
</soapenv:Envelope> 

我可以從W3Schools的建立最好的XSLT是這一個:

<?xml version="1.0" encoding="utf-8"?> 
<!-- Edited by XMLSpyΠ--> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 

<xsl:template match="/soapenv:Envelope/soapenv:Body/getHotelsResponse"> 
    <html> 
    <body> 
    <h2>Hotels in Barcelona</h2> 
    <table border="1"> 
     <tr bgcolor="#9acd32"> 
     <th>Hotel name</th> 
     <th>Rate ($/night)</th> 
     </tr> 
     <xsl:for-each select="getHotelsReturn"> 
     <tr> 
     <td><xsl:value-of select="name"/></td> 
     <td><xsl:value-of select="rate"/></td> 
     </tr> 
     </xsl:for-each> 
    </table> 
    </body> 
    </html> 
</xsl:template> 
</xsl:stylesheet> 

這應該會產生與我在w3schools中的例子類似的結果,但它會回到空白狀態。

任何人都可以解釋一下嗎?謝謝。

+1

請注意輸入的元素上的默認名稱空間綁定。您需要在XSLT中明確指出 - 爲該URI設置前綴並在匹配表達式中使用前綴。 – keshlam

+0

您可以請更具體一些,我對xslt很陌生,我試圖讓我的腦袋圍繞命名空間 – Ariestar

+0

如果別人不這樣做,我會盡量抽出時間在今天晚些時候寫出正確的答案。 – keshlam

回答

3

正如@keshlam指出,如果你輸入XML元素都有命名空間,你必須在你的XSLT聲明它們樣式表也是如此。

previous answer of mine中查找有關命名空間的更多詳細信息。

您在其中找到的信息的要點是:就XSLT處理器而言,getHotelsReturn元素與vb:getHotelsReturn元素完全不同。

樣式表

<?xml version="1.0" encoding="utf-8"?> 
<!-- Edited by XMLSpy?--> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:vb="http://hotel.booking.vbooking.com" 
    xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" 
    exclude-result-prefixes="soapenv vb"> 

<xsl:template match="/soapenv:Envelope/soapenv:Body/vb:getHotelsResponse"> 
    <html> 
    <body> 
    <h2>Hotels in Barcelona</h2> 
    <table border="1"> 
     <tr bgcolor="#9acd32"> 
     <th>Hotel name</th> 
     <th>Rate ($/night)</th> 
     </tr> 
     <xsl:for-each select="vb:getHotelsReturn"> 
     <tr> 
     <td><xsl:value-of select="vb:name"/></td> 
     <td><xsl:value-of select="vb:rate"/></td> 
     </tr> 
     </xsl:for-each> 
    </table> 
    </body> 
    </html> 
</xsl:template> 
</xsl:stylesheet> 

輸出

<html> 
    <body> 
     <h2>Hotels in Barcelona</h2> 
     <table border="1"> 
     <tr bgcolor="#9acd32"> 
      <th>Hotel name</th> 
      <th>Rate ($/night)</th> 
     </tr> 
     <tr> 
      <td>Downtown Hotel</td> 
      <td>235.0</td> 
     </tr> 
     </table> 
    </body> 
</html> 

呈現的HTML

enter image description here

+0

這太棒了,我會投票,但我沒有足夠的聲望,非常感謝你的幫助 – Ariestar

+0

謝謝Stuart - 我在測試轉換後添加了這個:-) –

-3

您可以使用XPath的是這樣的:

/Product1/Product2/Product3[@ValidYN = 'Y' and @ProductType = 'ABC'] 
/Product1/Product2/Product3[@ValidYN = 'Y' and @ProductType = 'DEF'] 
/Product1/Product2/Product3[@ValidYN = 'Y' and @ProductType = 'GHI'] 

檢查該另一個問題How to parse XML using XSLT?

+0

恐怕沒有回答這個問題。 – keshlam

+1

這完全是隨機的。與這個問題沒有任何關係。 –

+0

也許這將有助於http://stackoverflow.com/questions/4492303/parsing-xml-string-using-xslt – focusoft