生成 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 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 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 文档
…
<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 个模板
…
<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>
…
最终 XSLT 样式表如下所示
最终 XSLT 样式表
<?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>