生成 HTML

XSLT 在浏览器中的一种常见应用是在客户端将 XML 转换为 HTML。此示例将把输入文档 (example2.xml)(包含有关文章的信息)转换为 HTML 文档。

文章的<body> 元素现在包含 HTML 元素(一个<b><u> 标签)。XML 文档包含 HTML 元素和 XML 元素,但只需要一个命名空间,即用于 XML 元素的命名空间。由于没有 HTML 命名空间,并且使用 XHTML 命名空间将强制 XSL 创建一个无法像 HTML 文档一样运行的 XML 文档,因此 XSL 样式表中的xsl:output 将确保生成的文档将被视为 HTML。对于 XML 元素,需要我们自己的命名空间,http://devedge.netscape.com/2002/de,它被赋予了前缀 myNS (xmlns:myNS="http://devedge.netscape.com/2002/de")

XML 文件

xml
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="example2.xsl"?>
  <myNS:Article xmlns:myNS="http://devedge.netscape.com/2002/de">
    <myNS:Title>My Article</myNS:Title>
    <myNS:Authors>
      <myNS:Author company="Foopy Corp.">Mr. Foo</myNS:Author>
      <myNS:Author>Mr. Bar</myNS:Author>
    </myNS:Authors>
    <myNS:Body>
      The <b>rain</b> in <u>Spain</u> stays mainly in the plains.
    </myNS:Body>
  </myNS:Article>

使用的 XSL 样式表将需要两个命名空间 - 一个用于 XSLT 元素,另一个用于 XML 文档中使用的我们自己的 XML 元素。XSL 样式表的输出通过使用xsl:output 元素设置为HTML。通过将输出设置为 HTML 并且在生成的元素(以蓝色显示)上没有命名空间,这些元素将被视为 HTML 元素。

包含 2 个命名空间的 XSL 样式表

xml
<?xml version="1.0"?>
<xsl:stylesheet version="1.0"
                xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                xmlns:myNS="http://devedge.netscape.com/2002/de">

  <xsl:output method="html"/></xsl:stylesheet version="1.0">

创建一个匹配 XML 文档根节点的模板,并用于创建 HTML 页面的基本结构。

创建基本 HTML 文档

xml
<xsl:template match="/">
<html>

  <head>

    <title>
      <xsl:value-of select="/myNS:Article/myNS:Title"/>
    </title>

    <style>
      .myBox {margin:10px 155px 0 50px; border: 1px dotted #639ACE; padding:0 5px 0 5px;}
    </style>

  </head>

  <body>
    <p class="myBox">
      <span class="title">
        <xsl:value-of select="/myNS:Article/myNS:Title"/>
      </span> </br>

      Authors:   <br />
        <xsl:apply-templates select="/myNS:Article/myNS:Authors/myNS:Author"/>
    </p>

    <p class="myBox">
      <xsl:apply-templates select="//myNS:Body"/>
    </p>

  </body>

</html>
</xsl:template>

还需要三个xsl:template 来完成此示例。第一个xsl:template 用于作者节点,第二个用于处理正文节点。第三个模板有一个通用匹配规则,它将匹配任何节点和任何属性。它需要为了保留 XML 文档中的 HTML 元素,因为它匹配所有这些元素并将其复制到转换创建的 HTML 文档中。

最后的 3 个模板

xml
<xsl:template match="myNS:Author">
    --   <xsl:value-of select="." />

  <xsl:if test="@company">
    ::   <b>  <xsl:value-of select="@company" />  </b>
  </xsl:if>

  <br />
</xsl:template>
xml
<xsl:template match="myNS:Body">
  <xsl:copy>
    <xsl:apply-templates select="@*|node()"/>
  </xsl:copy>
</xsl:template>

<xsl:template match="@*|node()">
  <xsl:copy>
    <xsl:apply-templates select="@*|node()"/>
  </xsl:copy>
</xsl:template>

最终 XSLT 样式表如下所示

最终 XSLT 样式表

xml
<?xml version="1.0"?>
<xsl:stylesheet version="1.0"
                xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                xmlns:myNS="http://devedge.netscape.com/2002/de">

  <xsl:output method="html" />

  <xsl:template match="/">
    <html>

      <head>

        <title>
          <xsl:value-of select="/myNS:Article/myNS:Title"/>
        </title>

        <style>
          .myBox {margin:10px 155px 0 50px; border: 1px dotted #639ACE; padding:0 5px 0 5px;}
        </style>

      </head>

      <body>
        <p class="myBox">
          <span class="title">
            <xsl:value-of select="/myNS:Article/myNS:Title"/>
          </span> <br />

          Authors:   <br />
            <xsl:apply-templates select="/myNS:Article/myNS:Authors/myNS:Author"/>
          </p>

        <p class="myBox">
          <xsl:apply-templates select="//myNS:Body"/>
        </p>

      </body>

    </html>
  </xsl:template>

  <xsl:template match="myNS:Author">
      --   <xsl:value-of select="." />

    <xsl:if test="@company">
      ::   <b>  <xsl:value-of select="@company" />  </b>
    </xsl:if>

    <br />
  </xsl:template>

  <xsl:template match="myNS:Body">
    <xsl:copy>
      <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
  </xsl:template>

  <xsl:template match="@*|node()">
      <xsl:copy>
        <xsl:apply-templates select="@*|node()"/>
      </xsl:copy>
  </xsl:template>
</xsl:stylesheet>