5 XSL 转换

Wu Jun 2020-01-02 15:08:10
05 Java > 00 Java 基础 > 10 XML

XSL 指扩展样式表语言(EXtensible Stylesheet Language),可描述如何来显示 XML 文档。

XSL 包括三部分:XSLT、XPath、XSL-FO

1 XSLT

XSLT = XSL 转换,是一种用于将 XML 文档转换为 XHTML 文档或其他 XML 文档的语言。

XSLT 使用 XPath 来定义源文档中可匹配一个或多个预定义模板的部分。一旦匹配被找到,XSLT 就会把源文档的匹配部分转换为结果文档。

1.1 样式表声明

把文档声明为 XSL 样式表的根元素是 xsl:stylesheetxsl: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 表达式

  1. 从 XPathFactory 创建一个 XPath 对象
XPathFactory xpfactory = XPathFactory.newInstance();
path = xpfactory.newXPath();
  1. 计算 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);