### XSL 基础教程第二章

XSL–转换
本节将举例学习如何用 XSL 将 XML 转换成 HTML。这个举例的细节将在下一节中解释。
从 XML 文档开始
首先从打算转换成 HTML 的 XML 文档开始：
<?xml version="1.0"?>
<CATALOG>
<CD>
<TITLE>Empire Burlesque</TITLE>
<ARTIST>Bob Dylan</ARTIST>
<COUNTRY>USA</COUNTRY>
<COMPANY>Columbia</COMPANY>
<PRICE>10.90</PRICE>
<YEAR>1985</YEAR>
</CD>
如果使用的是 Internet Explorer 5.0 或更高版本，就可以查看这个 XML 文件的显示结果。
创建一个 XSL 样式表文档
现在用转换模板来创建一个 XSL 样式表：
<?xml version='1.0'?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl">
<xsl:template match="/">
<html>
<body>
<table border="2" bgcolor="yellow">
<tr>
<th>Title</th>
<th>Artist</th>
</tr>
<xsl:for-each select="CATALOG/CD">
<tr>
<td><xsl:value-of select="TITLE"/></td>
<td><xsl:value-of select="ARTIST"/></td>
</tr>
</xsl:for-each>
</table>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
如果使用的是 Internet Explorer 5.0 或更高版本，就可以查看这个 XSL 文件的显示结果。
将样式表连接到 XML 文档
现在向 XML 文档中增加一个 XSL 样式表引用：
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="cd_catalog.xsl"?>
<CATALOG>
<CD>
<TITLE>Empire Burlesque</TITLE>
<ARTIST>Bob Dylan</ARTIST>
<COUNTRY>USA</COUNTRY>
<COMPANY>Columbia</COMPANY>
<PRICE>10.90</PRICE>
<YEAR>1985</YEAR>
</CD>
.
.
.
如果有一个与 XSL 兼容的浏览器，例如 Internet Explorer 5.0 或更高版本，那么就能很好地将 XML 转换成 HTML。点击这里查看结果。
XSL 模板
XSL 用模板来描述如何输出 XML。
CSS 的使用规则
如果已经学习过 CSS 的知识，我们就会知道 CSS 是用一个或多个规则来定义 HTML 元素的输出，用一个选择器将规则与一个 HTML 元素联系起来。比如以下这个 CSS 规则中的 p 选择器说明应该用一种叫做 arial 的字体来显示一个<p>元素：
p { font-family: arial }
XSL 使用模板
XSL 使用一个或多个模板来定义如何输出 XML 元素，用一个匹配属性来将模板与一个 XML 元素联系起来，还可以用匹配属性来为 XML 文档的一个完整分支来定义模板。
请看以下的 XSL 样式表，它包含一个模板以输出前一节中的 XML CD 目录：
<?xml version='1.0'?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl">
<xsl:template match="/">
<html>
<body>
<table border="1">
<tr>
<th>Title</th>
<th>Artist</th>
</tr>
<tr>
<td>.</td>
<td>.</td>
</tr>
</table>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
由于样式表本身就是一个 XML 文档，因此文档以一个 xml 声明开始：<?xml version='1.0'?>。第二行中的 xsl:stylesheet 标记定义了样式表的开始。第三行中的 xsl:template 标记定义了一个模板的开始。模板属性 match="/"将模板与 XML 源文档的根 (/)联系（匹配）起来。文档的其它部分包含了模板本身，最后两行定义了模板的结束和样式表的结束。
用 Internet Explorer 5 来看看 XML 文件、XSL 文件以及结果。
<xsl:value-of>元素
前面例子的结果有点令人失望，因为没有将数据从 XML 文档复制到输出中。XSL 的<xsl:value-of>元素可以用来选择进入 XSL 转换输出流中的 XML 元素：
<?xml version='1.0'?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl">
<xsl:template match="/">
<html>
<body>
<table border="1">
<tr>
<th>Title</th>
<th>Artist</th>
</tr>
<tr>
<td><xsl:value-of select="CATALOG/CD/TITLE"/></td>
<td><xsl:value-of select="CATALOG/CD/ARTIST"/></td>
</tr>
</table>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
注意：选择属性值用到的语法被称为 XSL 模式。它工作起来就象是在一个文件系统中航行，其中用一个前斜线 (/) 来选择子目录。
用 Internet Explorer 5 来看看 XML 文件、XSL 文件以及结果。
<xsl:for-each>元素
前面例子中的结果还是有点不太令人满意，因为从 XML 文档中只复制了一行数据到输出。XSL 的<xsl:for-each>元素可以用来将每个 XML 元素选择到 XSL 转换的输出流中：
<?xml version='1.0'?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl">
<xsl:template match="/">
<html>
<body>
<table border="1">
<tr>
<th>Title</th>
<th>Artist</th>
</tr>
<xsl:for-each select="CATALOG/CD">
<tr>
<td><xsl:value-of select="TITLE"/></td>
<td><xsl:value-of select="ARTIST"/></td>
</tr>
</xsl:for-each>
</table>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
xsl:for-each 元素在 XML 文档中查找元素，然后为每个元素重复模板的一部分。
用 Internet Explorer 5 来看看 XML 文件、XSL 文件以及结果。