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

問題は、2 番目のサンプルでは既定の名前空間が指定されているため、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 サンプルではなく、2 番目の 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>

これにより、最初と 2 番目の XML サンプルの両方で同じ出力が得られるはずです。

于 2012-08-16T11:20:51.383 に答える
0

XSL は両方の XML に対して正常に機能します。他に何か問題があるはずです。XML ノードに属性を追加しても、変換に影響を与えてはなりません。

于 2012-08-16T09:02:52.347 に答える