XSL 指扩展样式表语言(EXtensible Stylesheet Language),可描述如何来显示 XML 文档。
XSL 包括三部分:XSLT、XPath、XSL-FO
1 XSLT
XSLT = XSL 转换,是一种用于将 XML 文档转换为 XHTML 文档或其他 XML 文档的语言。
XSLT 使用 XPath 来定义源文档中可匹配一个或多个预定义模板的部分。一旦匹配被找到,XSLT 就会把源文档的匹配部分转换为结果文档。
1.1 样式表声明
把文档声明为 XSL 样式表的根元素是 xsl:stylesheet 或 xsl:transform。
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<!--Or-->
<xsl:transform version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
1.2 样式表模板
1)xsl:template 元素
用于构建模板。
match 属性用于关联 XML 元素和模板。match 属性也可用来为整个文档定义模板。match 属性的值是 XPath 表达式(举例,match=“/” 定义整个文档)。
2)xsl:value-of 元素
用于提取某个选定节点的值,并把值添加到转换的输出流中。
select 属性的值是一个 XPath 表达式。
3)xsl:for-each 元素
用于选取指定的节点集中的每个 XML 元素。
select 属性的值是一个 XPath 表达式。
4)xsl:sort 元素
用于对结果进行排序。
select 属性的值是一个 XPath 表达式。
5)xsl:if 元素
<xsl:if test="expression">
  ...
  ...如果条件成立则输出...
  ...
</xsl:if>
6)xsl:choose 元素
<xsl:choose>
  <xsl:when test="expression">
    ... 输出 ...
  </xsl:when>
  <xsl:otherwise>
    ... 输出 ....
  </xsl:otherwise>
</xsl:choose>
1.3 实例
1)原始 XML 文档
<?xml version="1.0" encoding="ISO-8859-1"?>
<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>
2)创建 XSL 样式表
<?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>
3)把 XSL 样式表链接到 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>
2 XPath
XPath 是一种用于在 XML 文档中进行导航的语言。
XPath 使用路径表达式来选取 XML 文档中的节点或者节点集。节点是通过沿着路径 (path) 或者步 (steps) 来选取的。
XPath 节点
在 XPath 中,有七种类型的节点:元素、属性、文本、命名空间、处理指令、注释以及文档节点(或称为根节点)。XML 文档是被作为节点树来对待的。树的根被称为文档节点或者根节点。
2.1 语法
1)路径表达式
最有用的路径表达式
| 表达式 | 描述 | 
|---|---|
| nodename | 选取此节点的所有子节点。 | 
| / | 从根节点选取。 | 
| // | 从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置。 | 
| . | 选取当前节点。 | 
| … | 选取当前节点的父节点。 | 
| @ | 选取属性。 | 
2)谓语(Predicates)
谓语用来查找某个特定的节点或者包含某个指定的值的节点。
谓语被嵌在方括号中。
| 路径表达式 | 结果 | 
|---|---|
| /bookstore/book[1] | 选取属于 bookstore 子元素的第一个 book 元素。 | 
| /bookstore/book[last()] | 选取属于 bookstore 子元素的最后一个 book 元素。 | 
| /bookstore/book[position()< 3] | 选取最前面的两个属于 bookstore 元素的子元素的 book 元素。 | 
| //title[@lang] | 选取所有拥有名为 lang 的属性的 title 元素。 | 
3)选取未知节点
XPath 通配符可用来选取未知的 XML 元素。
| 通配符 | 描述 | 
|---|
- |匹配任何元素节点。 @* |匹配任何属性节点。 node() |匹配任何类型的节点。
4)选取若干路径
通过在路径表达式中使用“|”运算符,可以选取若干个路径。
2.2 实例
Java SE 5.0 增加了一个 API 来计算 XPath 表达式
- 从 XPathFactory 创建一个 XPath 对象
XPathFactory xpfactory = XPathFactory.newInstance();
path = xpfactory.newXPath();
- 计算 XPath 表达式
String result = path.evaluate(expression, doc);
NodeList nodes = (NodeList)path.evaluate(expression, doc, XPathConstants.NODESET);
Node node = (Node)path.evaluate(expression, doc, XPathConstants.NODE);
int count =((Number)path.evaluate(expression, doc, XPathConstants.NUMBER)) .intValue();
//从任意一个节点或节点列表开始
result = path.evaluate(expression, node);