繁体   English   中英

使用XSL转换XML

[英]Transform XML using XSL

我正在使用简单的XSL格式化xml文件,当容器标记中没有其他数据时,该XSL可以正常工作,但如果标记中有数据,则不显示任何数据。

当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>

问题在于,对于第二个示例,已经指定了默认名称空间,因此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示例,而不适用于第一个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样本,这应该提供相同的输出。

您的XSL对于两种XML都可以正常工作。 肯定还有其他问题。 向XML节点添加属性必须不影响转换。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM