2011-10-21 49 views
0

我试图通过xslt将xml文件从ECB转换为xhtml,但我有某处错误。通过xslt更改xml到xhtml

这是XML文件

<?xml version="1.0" encoding="UTF-8"?> 
<?xml-stylesheet type="text/xsl" href="output.xsl"?> 
<gesmes:Envelope xmlns:gesmes="http://www.gesmes.org/xml/2002-08-01" 
    xmlns="http://www.ecb.int/vocabulary/2002-08-01/eurofxref"> 
    <gesmes:subject>Reference rates</gesmes:subject> 
    <gesmes:Sender> 
     <gesmes:name>European Central Bank</gesmes:name> 
    </gesmes:Sender> 
    <Cube> 
     <Cube time='2011-10-18'> 
      <Cube currency='USD' rate='1.3676'/> 
      <Cube currency='JPY' rate='104.97'/> 
      <Cube currency='BGN' rate='1.9558'/> 
      <Cube currency='CZK' rate='24.925'/> 
      <Cube currency='DKK' rate='7.4456'/> 
      <Cube currency='GBP' rate='0.87020'/> 
      <Cube currency='HUF' rate='298.40'/> 
      <Cube currency='LTL' rate='3.4528'/> 
      <Cube currency='LVL' rate='0.7057'/> 
      <Cube currency='PLN' rate='4.3684'/> 
      <Cube currency='RON' rate='4.3525'/> 
      <Cube currency='SEK' rate='9.1589'/> 
      <Cube currency='CHF' rate='1.2348'/> 
      <Cube currency='NOK' rate='7.7605'/> 
      <Cube currency='HRK' rate='7.4715'/> 
      <Cube currency='RUB' rate='42.8780'/> 
      <Cube currency='TRY' rate='2.5568'/> 
      <Cube currency='AUD' rate='1.3489'/> 
      <Cube currency='BRL' rate='2.4332'/> 
      <Cube currency='CAD' rate='1.4018'/> 
      <Cube currency='CNY' rate='8.7262'/> 
      <Cube currency='HKD' rate='10.6373'/> 
      <Cube currency='IDR' rate='12061.31'/> 
      <Cube currency='ILS' rate='4.9936'/> 
      <Cube currency='INR' rate='67.5500'/> 
      <Cube currency='KRW' rate='1567.60'/> 
      <Cube currency='MXN' rate='18.5187'/> 
      <Cube currency='MYR' rate='4.2854'/> 
      <Cube currency='NZD' rate='1.7360'/> 
      <Cube currency='PHP' rate='59.256'/> 
      <Cube currency='SGD' rate='1.7423'/> 
      <Cube currency='THB' rate='42.095'/> 
      <Cube currency='ZAR' rate='11.0432'/> 
     </Cube> 
    </Cube> 
</gesmes:Envelope> 

,这里是我的XSLT文件

<?xml version="1.0" encoding="utf-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="html" encoding="utf-8" doctype-public="-//W3C//DTD XHTML 1.0 Transitional//EN" doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"/> 
  
    <xsl:template match="/"> 
        <html xmlns="http://www.w3.org/1999/xhtml"> 
        <head> 
            <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> 
            <title>Exchange rates</title> 

     </head> 

        <body> 
            <table> 
                <tr> 
                    <th>Rate</th> 
                </tr> 
      <xsl:for-each select="/gesmes:Envelope/Cube/Cube/Cube"> 
      <tr> 
        <td><xsl:value-of select="Cube/[@currency='USD']"/></td> 

       </tr> 
       </xsl:for-each> 

            </table> 
        </body> 
        </html> 
    </xsl:template> 
</xsl:stylesheet> 

,并导致这个样子:

USD 1.3676 
JPY 104.97 
BGN 1.9558 

我需要一个解决方案,而不是一个方式如何o获得正确的源代码。

回答

0

看来想要像这样(我刚才编辑代码 - 我自己的解决方案会有所不同):

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:gesmes="http://www.gesmes.org/xml/2002-08-01" 
xmlns:ecb="http://www.ecb.int/vocabulary/2002-08-01/eurofxref" 
> 
    <xsl:output method="xml" encoding="utf-8" doctype-public="-//W3C//DTD XHTML 1.0 Transitional//EN" doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"/> 
    <xsl:template match="/"> 
     <html xmlns="http://www.w3.org/1999/xhtml"> 
      <head> 
       <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> 
       <title>Exchange rates</title> 
      </head> 
      <body> 
       <table> 
        <tr> 
         <th>Currency</th> 
         <th>Rate</th> 
        </tr> 
        <xsl:for-each select="/gesmes:Envelope/ecb:Cube/ecb:Cube/ecb:Cube"> 
         <tr> 
          <td> 
           <b><xsl:value-of select="@currency"/></b> 
          </td> 
          <td> 
           <xsl:value-of select="@rate"/> 
          </td> 
         </tr> 
        </xsl:for-each> 
       </table> 
      </body> 
     </html> 
    </xsl:template> 
</xsl:stylesheet> 

当所提供的XML文档应用:

<gesmes:Envelope xmlns:gesmes="http://www.gesmes.org/xml/2002-08-01" 
xmlns="http://www.ecb.int/vocabulary/2002-08-01/eurofxref"> 
    <gesmes:subject>Reference rates</gesmes:subject> 
    <gesmes:Sender> 
     <gesmes:name>European Central Bank</gesmes:name> 
    </gesmes:Sender> 
    <Cube> 
     <Cube time='2011-10-18'> 
      <Cube currency='USD' rate='1.3676'/> 
      <Cube currency='JPY' rate='104.97'/> 
      <Cube currency='BGN' rate='1.9558'/> 
      <Cube currency='CZK' rate='24.925'/> 
      <Cube currency='DKK' rate='7.4456'/> 
      <Cube currency='GBP' rate='0.87020'/> 
      <Cube currency='HUF' rate='298.40'/> 
      <Cube currency='LTL' rate='3.4528'/> 
      <Cube currency='LVL' rate='0.7057'/> 
      <Cube currency='PLN' rate='4.3684'/> 
      <Cube currency='RON' rate='4.3525'/> 
      <Cube currency='SEK' rate='9.1589'/> 
      <Cube currency='CHF' rate='1.2348'/> 
      <Cube currency='NOK' rate='7.7605'/> 
      <Cube currency='HRK' rate='7.4715'/> 
      <Cube currency='RUB' rate='42.8780'/> 
      <Cube currency='TRY' rate='2.5568'/> 
      <Cube currency='AUD' rate='1.3489'/> 
      <Cube currency='BRL' rate='2.4332'/> 
      <Cube currency='CAD' rate='1.4018'/> 
      <Cube currency='CNY' rate='8.7262'/> 
      <Cube currency='HKD' rate='10.6373'/> 
      <Cube currency='IDR' rate='12061.31'/> 
      <Cube currency='ILS' rate='4.9936'/> 
      <Cube currency='INR' rate='67.5500'/> 
      <Cube currency='KRW' rate='1567.60'/> 
      <Cube currency='MXN' rate='18.5187'/> 
      <Cube currency='MYR' rate='4.2854'/> 
      <Cube currency='NZD' rate='1.7360'/> 
      <Cube currency='PHP' rate='59.256'/> 
      <Cube currency='SGD' rate='1.7423'/> 
      <Cube currency='THB' rate='42.095'/> 
      <Cube currency='ZAR' rate='11.0432'/></Cube></Cube> 
</gesmes:Envelope> 

通缉,会产生正确的结果

<?xml version="1.0" encoding="utf-8"?> 
<!DOCTYPE html 
    PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml"> 
    <head> 
     <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> 
     <title>Exchange rates</title> 
    </head> 
    <body> 
     <table> 
      <tr> 
       <th>Currency</th> 
       <th>Rate</th> 
      </tr> 
      <tr> 
       <td> 
        <b>USD</b> 
       </td> 
       <td>1.3676</td> 
      </tr> 
      <tr> 
       <td> 
        <b>JPY</b> 
       </td> 
       <td>104.97</td> 
      </tr> 
      <tr> 
       <td> 
        <b>BGN</b> 
       </td> 
       <td>1.9558</td> 
      </tr> 
      <tr> 
       <td> 
        <b>CZK</b> 
       </td> 
       <td>24.925</td> 
      </tr> 
      <tr> 
       <td> 
        <b>DKK</b> 
       </td> 
       <td>7.4456</td> 
      </tr> 
      <tr> 
       <td> 
        <b>GBP</b> 
       </td> 
       <td>0.87020</td> 
      </tr> 
      <tr> 
       <td> 
        <b>HUF</b> 
       </td> 
       <td>298.40</td> 
      </tr> 
      <tr> 
       <td> 
        <b>LTL</b> 
       </td> 
       <td>3.4528</td> 
      </tr> 
      <tr> 
       <td> 
        <b>LVL</b> 
       </td> 
       <td>0.7057</td> 
      </tr> 
      <tr> 
       <td> 
        <b>PLN</b> 
       </td> 
       <td>4.3684</td> 
      </tr> 
      <tr> 
       <td> 
        <b>RON</b> 
       </td> 
       <td>4.3525</td> 
      </tr> 
      <tr> 
       <td> 
        <b>SEK</b> 
       </td> 
       <td>9.1589</td> 
      </tr> 
      <tr> 
       <td> 
        <b>CHF</b> 
       </td> 
       <td>1.2348</td> 
      </tr> 
      <tr> 
       <td> 
        <b>NOK</b> 
       </td> 
       <td>7.7605</td> 
      </tr> 
      <tr> 
       <td> 
        <b>HRK</b> 
       </td> 
       <td>7.4715</td> 
      </tr> 
      <tr> 
       <td> 
        <b>RUB</b> 
       </td> 
       <td>42.8780</td> 
      </tr> 
      <tr> 
       <td> 
        <b>TRY</b> 
       </td> 
       <td>2.5568</td> 
      </tr> 
      <tr> 
       <td> 
        <b>AUD</b> 
       </td> 
       <td>1.3489</td> 
      </tr> 
      <tr> 
       <td> 
        <b>BRL</b> 
       </td> 
       <td>2.4332</td> 
      </tr> 
      <tr> 
       <td> 
        <b>CAD</b> 
       </td> 
       <td>1.4018</td> 
      </tr> 
      <tr> 
       <td> 
        <b>CNY</b> 
       </td> 
       <td>8.7262</td> 
      </tr> 
      <tr> 
       <td> 
        <b>HKD</b> 
       </td> 
       <td>10.6373</td> 
      </tr> 
      <tr> 
       <td> 
        <b>IDR</b> 
       </td> 
       <td>12061.31</td> 
      </tr> 
      <tr> 
       <td> 
        <b>ILS</b> 
       </td> 
       <td>4.9936</td> 
      </tr> 
      <tr> 
       <td> 
        <b>INR</b> 
       </td> 
       <td>67.5500</td> 
      </tr> 
      <tr> 
       <td> 
        <b>KRW</b> 
       </td> 
       <td>1567.60</td> 
      </tr> 
      <tr> 
       <td> 
        <b>MXN</b> 
       </td> 
       <td>18.5187</td> 
      </tr> 
      <tr> 
       <td> 
        <b>MYR</b> 
       </td> 
       <td>4.2854</td> 
      </tr> 
      <tr> 
       <td> 
        <b>NZD</b> 
       </td> 
       <td>1.7360</td> 
      </tr> 
      <tr> 
       <td> 
        <b>PHP</b> 
       </td> 
       <td>59.256</td> 
      </tr> 
      <tr> 
       <td> 
        <b>SGD</b> 
       </td> 
       <td>1.7423</td> 
      </tr> 
      <tr> 
       <td> 
        <b>THB</b> 
       </td> 
       <td>42.095</td> 
      </tr> 
      <tr> 
       <td> 
        <b>ZAR</b> 
       </td> 
       <td>11.0432</td> 
      </tr> 
     </table> 
    </body> 
</html> 

我自己的解决方案会更喜欢这个

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:gesmes="http://www.gesmes.org/xml/2002-08-01" 
xmlns:ecb="http://www.ecb.int/vocabulary/2002-08-01/eurofxref" 
exclude-result-prefixes="ecb gesmes"> 
    <xsl:output method="xml" encoding="utf-8" 
    doctype-public="-//W3C//DTD XHTML 1.0 Transitional//EN" 
    doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"/> 

    <xsl:strip-space elements="*"/> 

    <xsl:template match="ecb:Cube/ecb:Cube"> 
     <html xmlns="http://www.w3.org/1999/xhtml"> 
      <head> 
       <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> 
       <title>Exchange rates</title> 
      </head> 
      <body> 
       <table> 
        <tr> 
         <th>Currency</th> 
         <th>Rate</th> 
        </tr> 
       <xsl:apply-templates/> 
       </table> 
      </body> 
     </html> 
    </xsl:template> 

    <xsl:template match="ecb:Cube/ecb:Cube/ecb:Cube" priority="5"> 
      <tr> 
       <td> 
        <b><xsl:value-of select="@currency"/></b> 
       </td> 
       <td> 
        <xsl:value-of select="@rate"/> 
       </td> 
      </tr> 
    </xsl:template> 
    <xsl:template match="text()"/> 
</xsl:stylesheet> 
+0

然后,我只是运行的.xsl文件?因为它显示我错了,我看到源代码,这是错误的。 – user1006959

+0

@ user1006959:您需要复制代码,将其粘贴到文本编辑器中并将其保存在文件中。然后将此文件中的转换应用于包含源XML的文件(使用您喜欢的任何方法 - 例如从命令行)。我从未发布未经测试的解决方案。正如在这种情况下,我总是运行解决方案并验证它产生了预期的结果。然后我简单地复制代码并将其粘贴到我的答案中。如果您遇到问题如何进行转换,请提出另一个问题。 –

+0

好的,我创建了两个新文件。我将源文件复制到这些文件中。但是当我在Opera,Chrome或Safari上运行它时,它显示我只是'Currency \t Rate'。你有什么主意吗? – user1006959

1

好的!我没看见。

你的主要问题是一个命名空间: XSLT引擎不知道什么是gesmes,所以你需要告诉它。 所以你需要将它添加到你的xsl:stylesheet标签中。

  • 的xmlns:GESMES = “http://www.gesmes.org/xml/2002-08-01”

您需要添加并命名为XML的默认命名空间的命名空间:

  • 的xmlns:XX = “http://www.ecb.int/vocabulary/2002-08-01/eurofxref” 让你的样式表将开始:

    <的xsl:样式版本sion =“1.0” xmlns:xsl =“http://www.w3.org/1999/XSL/Transform” xmlns:gesmes =“http://www.gesmes.org/xml/2002-08-01 “ 的xmlns:XX =” http://www.ecb.int/vocabulary/2002-08-01/eurofxref” >

您的for-each将是: <的xsl:for-每个选择= “/ GESMES:信封/ XX:立方/ XX:立方/ XX:魔方” >

,它应该工作...但我建议你在地方XSL的使用模板:对,每个

这是我建议的解决方案: 好的!我没看见。

你的主要问题是一个命名空间: XSLT引擎不知道什么是gesmes,所以你需要告诉它。 所以你需要将它添加到你的xsl:stylesheet标签中。

  • 的xmlns:GESMES = “http://www.gesmes.org/xml/2002-08-01”

您需要添加并命名为XML的默认命名空间的命名空间:

  • 的xmlns:XX =“HTTP://www.ecb。INT /词汇/ 2002-08-01/eurofxref “ 让你的样式表将开始:

    <的xsl:样式版本= ”1.0“ 的xmlns:XSL =” http://www.w3.org/1999/XSL/Transform“ xmlns:gesmes =”http://www.gesmes.org/xml/2002-08-01“ xmlns:xx =”http://www.ecb.int/vocabulary/2002-08 -01/eurofxref” >

您的for-each将是: <的xsl:for-每个选择= “/ GESMES:信封/ XX:立方/ XX:立方/ XX:魔方” >

,它应该工作...但我建议你在地方XSL的使用模板:对,每个

这里是我提出解决方案:

<?xml version="1.0" encoding="utf-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
       xmlns:gesmes="http://www.gesmes.org/xml/2002-08-01" 
       xmlns:xx="http://www.ecb.int/vocabulary/2002-08-01/eurofxref"> 
<xsl:output method="html" encoding="utf-8" doctype-public="-//W3C//DTD XHTML 1.0 Transitional//EN" doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"/> 
<xsl:template match="/"> 
    <html xmlns="http://www.w3.org/1999/xhtml"> 
    <body> 
     <table> 
     <tr><th>Rate</th></tr> 
     <xsl:apply-templates select="gesmes:Envelope/xx:Cube/xx:Cube/xx:Cube" /> 
     </table> 
    </body> 
    </html> 
</xsl:template> 

<xsl:template match="xx:Cube"> 
    <tr> 
    <td><xsl:value-of select="@currency"/></td> 
    <td><xsl:value-of select="@rate"/></td> 
    </tr> 
</xsl:template> 
</xsl:stylesheet> 
0

XSLT:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
       xmlns:ns="http://www.ecb.int/vocabulary/2002-08-01/eurofxref" 
       xmlns:gesmes="http://www.gesmes.org/xml/2002-08-01"> 
    <xsl:output method="html" encoding="utf-8" doctype-public="-//W3C//DTD XHTML 1.0 Transitional//EN" 
       doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"/> 


    <xsl:template match="/"> 
     <html xmlns="http://www.w3.org/1999/xhtml"> 
      <head> 
       <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> 
       <title>Exchange rates</title> 
      </head> 

      <body> 
       <table> 
        <tr> 
         <th>Rate</th> 
         <th>Value</th> 
        </tr> 
        <xsl:apply-templates select="//ns:Cube/ns:Cube"/> 


       </table> 
      </body> 
     </html> 
    </xsl:template> 

    <xsl:template match="ns:Cube"> 
     <tr xmlns="http://www.w3.org/1999/xhtml"> 
      <td> 
       <xsl:value-of select="@currency"/> 
      </td> 
      <td> 
       <xsl:value-of select="@rate"/> 
      </td> 
     </tr> 
    </xsl:template> 

</xsl:stylesheet> 

输出:

Rate Value 
USD 1.3676 
JPY 104.97 
BGN 1.9558 
CZK 24.925 
DKK 7.4456 
GBP 0.8702 
HUF 298.4 
LTL 3.4528 
LVL 0.7057 
PLN 4.3684 
RON 4.3525 
SEK 9.1589 
CHF 1.2348 
NOK 7.7605 
HRK 7.4715 
RUB 42.878 
TRY 2.5568 
AUD 1.3489 
BRL 2.4332 
CAD 1.4018 
CNY 8.7262 
HKD 10.6373 
IDR 12061.31 
ILS 4.9936 
INR 67.55 
KRW 1567.6 
MXN 18.5187 
MYR 4.2854 
NZD 1.736 
PHP 59.256 
SGD 1.7423 
THB 42.095 
ZAR 11.0432