2012-08-16 92 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节点不得影响转换。