2012-08-16 94 views
0

我使用簡單的XSL格式化xml文件,當容器標籤中沒有附加數據時工作正常,但如果標籤中有數據則不顯示任何數據。使用XSL轉換XML

當XML是這個樣子的罰款

<Result> 
<primaryTopic> 
    <CompanyName>ZENITH PRINT (UK) LIMITED</CompanyName> 
    <RegAddress> 
    <AddressLine1>ZENITH HOUSE</AddressLine1> 
    <AddressLine2>MOY ROAD INDUSTRIAL ESTATE</AddressLine2> 
    <PostTown>TAFFS WELL</PostTown> 
    <County>CARDIFF</County> 
    <Postcode>CF15 7QR</Postcode> 
    </RegAddress> 

當有這樣的標籤URL數據失敗

<Result xmlns="http://#####.uk/terms/xxx"> 
<primaryTopic> 
    <CompanyName>ZENITH PRINT (UK) LIMITED</CompanyName> 
    <RegAddress href="http://#####.uk/doc/company/02050399#RegAddress"> 
    <AddressLine1>ZENITH HOUSE</AddressLine1> 
    <AddressLine2>MOY ROAD INDUSTRIAL ESTATE</AddressLine2> 
    <PostTown>TAFFS WELL</PostTown> 
    <County>CARDIFF</County> 
    <Postcode>CF15 7QR</Postcode> 
    </RegAddress> 

我使用

<?xml version="1.0" encoding="ISO-8859-1"?> 
<!-- Edited by XMLSpy® --> 
<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:template match="/"> 
    <html> 
    <body> 
    <h2><xsl:value-of select="Result/primaryTopic/CompanyName"/></h2> 
    <table border="1"> 
     <tr> 
     <td>Company Name</td> 
     <td><xsl:value-of select="Result/primaryTopic/CompanyName"/></td> 
     <td>Address</td> 
     <td><xsl:value-of select="Result/primaryTopic/RegAddress/AddressLine1"/></td> 
     </tr> 
    </table> 
    </body> 
    </html> 
</xsl:template> 
</xsl:stylesheet> 
+0

什麼是失敗的消息?或者你期望什麼,你看到了什麼 – hkutluay 2012-08-16 08:45:55

+0

無法重現,兩個XML在這裏給出相同的輸出。 – hroptatyr 2012-08-16 08:48:40

+0

是URL ACTUALLY'#####'中的'#####'?還是那些你變成匿名的角色?注意字符<,&和「在XML屬性中是不允許的 – 2012-08-16 08:50:23

回答

1

的問題是,對於第二個樣本,一個默認的命名空間已指定,因此在XML的所有元素將是命名空間的一部分

<Result xmlns="http://#####.uk/terms/xxx"> 

但是,您的XSLT正在尋找元件,其沒有名稱空間,所以它不會匹配XML中的元素,它們具有名稱空間。

的解決方案是確保命名空間是你的XSLT的一部分,當你匹配的元素

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xxx="http://#####.uk/terms/xxx" exclude-result-prefixes="xxx"> 
    <xsl:template match="/"> 
     <html> 
     <body> 
      <h2> 
       <xsl:value-of select="xxx:Result/xxx:primaryTopic/xxx:CompanyName"/> 
      </h2> 
      <table border="1"> 
       <tr> 
        <td>Company Name</td> 
        <td> 
        <xsl:value-of select="xxx:Result/xxx:primaryTopic/xxx:CompanyName"/> 
        </td> 
        <td>Address</td> 
        <td> 
        <xsl:value-of select="xxx:Result/xxx:primaryTopic/xxx:RegAddress/xxx:AddressLine1"/> 
        </td> 
       </tr> 
      </table> 
     </body> 
     </html> 
    </xsl:template> 
</xsl:stylesheet> 

當然,這隻會在你的第二個XML樣本工作,而不是第一個。如果你想要一個可以同時處理這兩個樣本的XSLT,你可以做這樣的事情來檢查元素名稱,而不管命名空間。

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:template match="/*/*[local-name()='primaryTopic']"> 
     <html> 
     <body> 
      <h2> 
       <xsl:value-of select="*[local-name() = 'CompanyName']"/> 
      </h2> 
      <table border="1"> 
       <tr> 
        <td>Company Name</td> 
        <td> 
        <xsl:value-of select="*[local-name() = 'CompanyName']"/> 
        </td> 
        <td>Address</td> 
        <td> 
        <xsl:value-of select="*[local-name() = 'RegAddress']/*[local-name() = 'AddressLine1']"/> 
        </td> 
       </tr> 
      </table> 
     </body> 
     </html> 
    </xsl:template> 
</xsl:stylesheet> 

這應該爲第一個和第二個XML樣本提供相同的輸出。

+0

謝謝Tim這正是我所需要的。 – Gareth 2012-08-16 12:35:51

0
的XSL

您的XSL適用於這兩種XML。一定有其他事情出錯了。將屬性添加到XML節點不得影響轉換。