XML Learning - XSLT
Wisdom Guo
Overview
XSL - 不仅仅是样式表语言
- XSL 包括三部分:
- XSLT
- 一种用于转换 XML 文档的语言。
- XSLT 是一种用于将 XML 文档转换为 XHTML 文档或其他 XML 文档的语言。
- XPath
- 一种用于在 XML 文档中导航的语言。
- XPath 是一种用于在 XML 文档中进行导航的语言。
- XSL-FO
- 一种用于格式化 XML 文档的语言。
什么是 XSLT?
- XSLT 指 XSL 转换(XSL Transformations)。
- XSLT 是 XSL 中最重要的部分。
- XSLT 可将一种 XML 文档转换为另外一种 XML 文档。
- XSLT 使用 XPath 在 XML 文档中进行导航。
- XPath 是一个 W3C 标准。
XSLT = XSL 转换
XSLT 是 XSL 中最重要的部分。
XSLT 用于将一种 XML 文档转换为另外一种 XML 文档,或者可被浏览器识别的其他类型的文档,比如 HTML 和 XHTML。通常,XSLT 是通过把每个 XML 元素转换为 (X)HTML 元素来完成这项工作的。
通过 XSLT,您可以向或者从输出文件添加或移除元素和属性。您也可重新排列元素,执行测试并决定隐藏或显示哪个元素,等等。
描述转化过程的一种通常的说法是,XSLT 把 XML 源树转换为 XML 结果树
创建XSLT
<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<html>
<body>
<h2>My CD Collection</h2>
<table border="1">
<tr bgcolor="#9acd32">
<th align="left">Title</th>
<th align="left">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>
NB: <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
=
<xsl:transform version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
如何在源xml中引用
<?xml version="1.0" encoding="ISO-8859-1"?>
<?xml-stylesheet type="text/xsl" href="cdcatalog.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>
.
.
</catalog>
XSLT 元素
<xsl:template> 元素
XSL 样式表由一个或多套被称为模板(template)的规则组成。
每个模板含有当某个指定的节点被匹配时所应用的规则。
<xsl:template> 元素用于构建模板。
match 属性用于关联 XML 元素和模板。match 属性也可用来为整个文档定义模板。match 属性的值是 XPath 表达式(举例,match="/" 定义整个文档)。
<xsl:value-of>
<xsl:value-of> 元素用于提取某个选定节点的值。
<td><xsl:value-of select="catalog/cd/title"/></td>
<td><xsl:value-of select="catalog/cd/artist"/></td>
<xsl:for-each> 元素
<xsl:for-each> 元素允许您在 XSLT 中进行循环。
<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>
结果过滤
通过在 <xsl:for-each> 元素中添加一个选择属性的判别式,我们也可以过滤由 XML 文件输出的结果。
<xsl:for-each select="catalog/cd[artist='Bob Dylan']">
合法的过滤运算符:
- = (等于)
- != (不等于)
- < (小于)
- > (大于)
在何处放置排序信息
如需对结果进行排序,只要简单地在 XSL 文件中的 <xsl:for-each> 元素内部添加一个 <xsl:sort> 元素:
<xsl:if> 元素
用于放置针对 XML 文件内容的条件测试
<xsl:if test="price > 10">
<tr>
<td><xsl:value-of select="title"/></td>
<td><xsl:value-of select="artist"/></td>
</tr>
</xsl:if>
<xsl:choose> 元素
用于结合 <xsl:when> 和 <xsl:otherwise> 来表达多重条件测试。
语法
<xsl:choose>
<xsl:when test="expression">
... 输出 ...
</xsl:when>
<xsl:otherwise>
... 输出 ....
</xsl:otherwise>
</xsl:choose>
<xsl:apply-templates> 元素
可把一个模板应用于当前的元素或者当前元素的子节点<xsl:apply-templates> 元素
<xsl:apply-templates> 元素可把一个模板应用于当前的元素或者当前元素的子节点。
假如我们向 <xsl:apply-templates> 元素添加一个 select 属性,此元素就会仅仅处理与属性值匹配的子元素。我们可以使用 select 属性来规定子节点被处理的顺序。
XSLT 程序控制转换
客户端
JavaScript 来load xml 和 xls 来进行控制转换。 需要浏览器支持xml解析
服务器端
.net 下进行load xml 和 xls 来进行控制转换。客户端不需要xml解析
Note:不需要引用在 xml文档中,这样一个xml文档就可以有多个xsl。
XSLT 元素表
元素 | 描述 | IE | N |
apply-imports | 从一个导入的样式表应用模板规则 | 6.0 |
|
apply-templates | 对当前元素或当前元素的子节点应用某个模板规则 | 5.0 | 6.0 |
attribute | 添加一个属性 | 5.0 | 6.0 |
attribute-set | 定义一套指定的属性 | 6.0 | 6.0 |
call-template | 调用一个指定的模板 | 6.0 | 6.0 |
choose | 与<when>以及<otherwise>协同使用来表达多重条件测试 | 5.0 | 6.0 |
comment | 在结果树中创建一个注释节点 | 5.0 | 6.0 |
copy | 创建当前节点的一个备份(无子节点及属性) | 5.0 | 6.0 |
copy-of | 创建当前节点的一个备份(带有子节点及属性) | 6.0 | 6.0 |
decimal-format | 定义把数字转换为字符串时被使用的字符和符号,使用format-number()函数。 | 6.0 |
|
element | 在输出文档中创建一个元素节点t | 5.0 | 6.0 |
fallback | 假如处理器不支持某个XSLT元素,规定一段备用代码来运行。 | 6.0 |
|
for-each | 循环遍历某个指定的节点集中的每个节点t | 5.0 | 6.0 |
if | 包含一个模板,仅当某个指定的条件成立时应用此模板。 | 5.0 | 6.0 |
import | 把一个样式表的内容导入另一个。注释:被导入的样式表的优先级低于所导入的样式表。 | 6.0 | 6.0 |
include | 把一个样式表的内容包含到另一个样式表。注释:被包含的样式表的优先级与所包含的样式表相同。 | 6.0 | 6.0 |
key | 声明一个指定的键,此键可通过key()函数用于样式表之中。 | 6.0 | 6.0 |
message | 向输出写一条消息(被用于错误报告) | 6.0 | 6.0 |
namespace-alias | 把样式表中的命名空间替换为输出中不同的命名空间 | 6.0 |
|
number | 测定当前节点的整数位置,并formats a number | 6.0 | 6.0 |
otherwise | 规定<choose>元素的默认动作 | 5.0 | 6.0 |
output | 定义输出文档的格式 | 6.0 | 6.0 |
param | 声明一个本地或全局参数 | 6.0 | 6.0 |
preserve-space | 定义元素中的空白字符如何被保留 | 6.0 | 6.0 |
processing-instruction | 向输出写一条处理指令 | 5.0 | 6.0 |
sort | 对输出进行排序 | 6.0 | 6.0 |
strip-space | 定义元素的空白字符应当被如何删除 | 6.0 | 6.0 |
stylesheet | 定义一个样式表的根元素 | 5.0 | 6.0 |
template | 当某个指定的节点被匹配时所应用的规则 | 5.0 | 6.0 |
text | 向输出写字面的文本 | 5.0 | 6.0 |
transform | 定义一个样式表的根元素 | 6.0 | 6.0 |
value-of | 提取某个被选定节点的值 | 5.0 | 6.0 |
variable | 声明一个本地或者全局的变量 | 6.0 | 6.0 |
when | 规定<choose>元素的动作 | 5.0 | 6.0 |
with-param | 规定需被传入某个模板的参数的值 | 6.0 | 6.0 |