首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >通过xslt将xml转换为xhtml

通过xslt将xml转换为xhtml
EN

Stack Overflow用户
提问于 2011-10-21 19:12:00
回答 3查看 2.8K关注 0票数 0

我试图通过xslt将xml文件从ECB转换为xhtml,但我在某些地方弄错了。

这是XML文件

代码语言:javascript
复制
<?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文件

代码语言:javascript
复制
<?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>

结果如下所示:

代码语言:javascript
复制
USD 1.3676
JPY 104.97
BGN 1.9558

诸若此类

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-10-21 20:27:48

似乎想要像这样的(我刚刚编辑了您的代码--我自己的解决方案可能会有所不同):

代码语言:javascript
复制
<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文档上应用时的

代码语言:javascript
复制
<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>

生成所需的正确结果

代码语言:javascript
复制
<?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>

我自己的解决方案会更像这样

代码语言:javascript
复制
<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
EN

Stack Overflow用户

发布于 2011-10-21 20:15:22

好的!我没看见。

您的主要问题是名称空间问题: XSLT引擎不知道什么是gesme,所以您需要告诉它。因此需要将其添加到xsl:stylesheet标记中。

  • xmlns:gesmes="http://www.gesmes.org/xml/2002-08-01"

您需要为xml的默认命名空间添加并命名一个命名空间:

  • xmlns:xx="http://www.ecb.int/vocabulary/2002-08-01/eurofxref“,因此您的样式表将以:

< xmlns:xx="">http://www.ecb.int/vocabulary/2002-08-01/eurofxref">:stylesheet version="1.0“xmlns:xsl="http://www.w3.org/1999/XSL/Transform”xmlns:gesmes="http://www.gesmes.org/xml/2002-08-01“xsl

for-each将是:

它应该是有效的。但是我建议您使用模板来代替xsl:for-each

这是我提出的解决方案:好的!我没看见。

您的主要问题是名称空间问题: XSLT引擎不知道什么是gesme,所以您需要告诉它。因此需要将其添加到xsl:stylesheet标记中。

  • xmlns:gesmes="http://www.gesmes.org/xml/2002-08-01"

您需要为xml的默认命名空间添加并命名一个命名空间:

  • xmlns:xx="http://www.ecb.int/vocabulary/2002-08-01/eurofxref“,因此您的样式表将以:

< xmlns:xx="">http://www.ecb.int/vocabulary/2002-08-01/eurofxref">:stylesheet version="1.0“xmlns:xsl="http://www.w3.org/1999/XSL/Transform”xmlns:gesmes="http://www.gesmes.org/xml/2002-08-01“xsl

for-each将是:

它应该是有效的。但是我建议您使用模板来代替xsl:for-each

以下是我提出的解决方案:

代码语言:javascript
复制
<?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>
票数 1
EN

Stack Overflow用户

发布于 2011-10-21 20:17:38

XSLT:

代码语言:javascript
复制
<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>

输出:

代码语言:javascript
复制
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 
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7848600

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档