0

我正在使用一个简单的 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>

我正在使用的 XSL

<?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>
4

2 回答 2

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 样本提供相同的输出。

于 2012-08-16T11:20:51.383 回答
0

您的 XSL 对这两种 XML 都适用。一定还有其他问题。向 XML 节点添加属性不得影响转换。

于 2012-08-16T09:02:52.347 回答