【问题标题】:XML to XHTML with XSL使用 XSL 将 XML 转换为 XHTML
【发布时间】:2019-03-22 15:39:51
【问题描述】:

我有两个 XML 文件,其中包含两个字典,其中包含两种不同语言(相同单词)的 10 个单词。我现在想使用 XSL 来链接这两个 XML 并将它们转换为 XHTML。

我现在这样做的方式,它似乎只给了我一个 HTML 输出。我该怎么办,我必须将 HTML 转换为 XHTML 还是直接将其转换为 XHTML 的一种方式?

这是我的一个字典 XML 的样子:

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/css" href="dict.css"?> 
<Dictionary xmlns="https://translate.google.se/m/translate?hl=sv/german">
    <Language>Swedish</Language>
    <Content>
        <Titel>Svensk ordlista</Titel>
        <Author>
            <Name> Translator </Name>
        </Author>
        <Words wordNum ="10">
            <Word ID="0">Vatten</Word>
            <Word ID="1">Häst</Word>
            <Word ID="2">Bil</Word>
            <Word ID="3">Katt</Word>
            <Word ID="4">Hund</Word>
            <Word ID="5">Snö</Word>
            <Word ID="6">Gata</Word>
            <Word ID="7">Hus</Word>
            <Word ID="8">Bord</Word>
            <Word ID="9">Hand</Word>
        </Words>
    </Content>
</Dictionary>

这就是我的 XML 链接的样子:

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="dictionary.xsl"?>
<links>
    <dictLink>german.xml</dictLink>
    <dictLink>Dic-swedish.xml</dictLink>
    <svgLogo>svglogo.svg</svgLogo>
</links>

这就是我的 XSL 的样子:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format">

<xsl:variable name="dictionary1">
<xsl:value-of select="/links/dictLink[1]" />
</xsl:variable>

<xsl:variable name="dictionary2">
    <xsl:value-of select="/dictionaries/dictLink[2]" />
</xsl:variable>

<xsl:variable name="logo">
    <xsl:value-of select="/dictionaries/svgLogo" />
</xsl:variable>

<xsl:template match="/dictionaries">

<html> <body> <xsl:value-of select="document($dic1)/Dictionary/@xml:Language"/><br/> </xsl:for-each> </body></html> </xsl:template> </xsl:stylesheet>

【问题讨论】:

    标签: xml xslt xhtml


    【解决方案1】:

    这可能只是部分解决方案,但您可以使用以下模板输出一些 (X)HTML:

    <?xml version="1.0" encoding="UTF-8"?>
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format" 
    xmlns:de="https://translate.google.se/m/translate?hl=sv/german" 
    exclude-result-prefixes="fo de">
      <xsl:output method="html" indent="yes" />
    
      <xsl:template match="/links">
        <html>
            <body> 
                <xsl:for-each select="dictLink">
                    <xsl:copy-of select="document(.)/*[local-name()='Dictionary']" /><br/> 
                </xsl:for-each>
            </body>
        </html> 
      </xsl:template> 
    </xsl:stylesheet>
    

    如果将此 XSLT 命名为 dictionary.xsl 并从浏览器调用第二个 XML,它应该将 Dic-swedish.xml(第一个 XML)的内容复制到输出。

    【讨论】:

      【解决方案2】:

      由于您使用的是 XSLT 1.0,请参阅 https://www.w3.org/TR/1999/REC-xslt-19991116#output

      由于结果树中的文档元素是html,没有命名空间,因此您将获得 HTML 输出。

      有关生成 XHTML 输出的 XSLT 1.0 示例,请参阅 https://www.w3.org/TR/1999/REC-xslt-19991116#section-Document-Example。其中的关键部分是:

      <xsl:stylesheet version="1.0"
                      xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                      xmlns="http://www.w3.org/TR/xhtml1/strict">
      
      <xsl:output
         method="xml"
         indent="yes"
         encoding="iso-8859-1"
      />
      

      如果您想要 DOCTYPE 声明,您可以将 xsl:output 更改为:

      <xsl:output
          method="xml"
          indent="yes"
          doctype-public="-//W3C//DTD XHTML 1.0 Strict//EN"
          doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"
          omit-xml-declaration="yes" />
      

      就个人而言,我不会费心将编码设置为 ISO-8859-1。如果没有 encoding 属性,您将获得 UTF-8 或 UTF-16,而且很可能是 UTF-8。无论是 UTF-8 还是 UTF-16,使用输出的 XML 系统都将能够处理编码。

      【讨论】:

      • 虽然这是正确答案,但您展示如何将编码设置为 ISO-8859-1 然后告诉 OP 不要打扰的部分令人困惑。为什么不更改示例以使用与 OP 相同的编码?
      • encoding="iso-8859-1" 逐字逐句来自 XSLT 1.0 规范。我从规范中复制了这些东西,以节省得到这样的评论,即 SO 喜欢不依赖外部网站的独立答案。如果没有 encoding 属性,结果将是 UTF-8 或 UTF-16。如今,它很可能是 UTF-8。
      • 我只是说没有必要逐字复制 W3C 示例代码。毕竟,这只是一个例子。
      猜你喜欢
      • 2011-02-27
      • 1970-01-01
      • 1970-01-01
      • 2012-02-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多