【0】README
0.1) 本文文字描述转自 core java volume 2 , 旨在理解 XML—— XSL 转换 的基础知识 ;
0.2)XSL 转换: XSL 转换(eXtensible StyleSheet Language==扩展样式表语言)
(for detailed XSLT, please visit http://blog.csdn.net/pacosonswjtu/article/details/50571734)
【1】XML—— XSL 转换基础相关
1)XSL转换(XSLT)机制定义:可以将XML 文档转换为其他格式的规则。(干货——XSLT的转换和作用)
- 1.1)XSLT的作用: XSLT 通常用来将某种机器可读的XML 格式转移为另一种机器可读的格式,或者将 XML 转译为适合人类阅读的表示格式;
2)你需要提供 XSLT 样式表, 它描述了 XML 文档向某种格式转换的规则。 XSLT 处理器将读入XML 文档和这个样式表, 并产生所要的输出。(见下图);
3)看个荔枝(吧 XML 文件转换为 HTML文件)
- 3.1)输入文件:
<staff>
<employee>
<name>a</name>
<salary>1</salary>
<hiredate year="1999" month="12" day="15" />
</employee>
......
</staff>
- 3.2)我们希望输出的html 文件为:
<table>
<tr>
<td>a</td> <td>1</td><td>1999-12-15</td>
</tr>
</table>
4)具有转换模板的样式表形式如下:
<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet
xmlns:xsl="http://www.w3.org/1999/XSL/Transformation="1.0">
<xsl: output method="html">
template1
template2
......
</xsl:stylesheet>
- 4.1)在我们的例子中, xsl:output 元素: 将方法设定为 HTML。 而其他有效的方法设置为 xml 和 text;
- 4.2)下面是一个典型的template: (干货——样式表转换模板定义)
<xsl: template match="/staff/employee">
<tr><xsl:apply-templates></tr>
</xsl: template>
4.3) match 属性值是一个 XPaht 表达式。该模板说明,每当看到 XPath 集 /staff/employee 中的一个节点时, 将做以下操作(Operation):
O1) 产生字符串< tr>;
- O2)对于要处理子元素继续应用模板;
- O3)当处理完所有子元素后, 产生字符串 ;
- 换句话说, 该模板围绕每个雇员记录生成 HTML 表格的行标记;
5)XSLT 处理器由检查根元素开始其处理过程。
- 5.1) 每当一个节点匹配某个模板时,就应该应用该模板, 如果没有匹配的模板, 处理器会执行默认操作,如下:
- Default1) 对于文本节点, 默认操作是吧它 的内容囊括到输出中去;
- Default2)对于元素, 默认操作不会产生任何输出, 但会继续处理其子节点;
6)看个荔枝: 下面是一个用来转换雇员记录文件中的name 节点的模板;
<xsl: template match="/staff/employee/name">
<td><xsl: apply-templates></td>
</xsl: template>
- 6.1)这样, 模板产生定界符< td>。。。< /td>,, 并且请求处理器递归访问 name 元素 的 子节点;
7)如果想把 属性值复制到输出中去, 就必须做一些复杂操作,如下:
<xsl: template match="/staff/employee/hiredate">
<td><xsl: value-of select="@year">-<xsl: value-of select="@month">-<xsl: value-of select="@day"></td>
<xsl: template />
- 7.1)当处理 hiredate节点时, 该模板会产生:
字符串<td>;
year属性值;
一个连字符;
month属性值;
一个连字符;
day属性值;
一个连字符;
字符串</td>;
- 7.2) xsl:value-of 语句:用于计算节点集的 字符串值, 其中,节点集 由 select 属性 的 XPath 值指定;
- 7.3)节点集通过连接各个节点的字符的字符串值被转换成一个字符串。 属性节点的字符串值就是它的值, 文本节点的字符串值是它 的内容, 元素节点的字符串值是它子节点(而不是属性)的字符串值的连接;
8)在java 平台下产生 XML 的转换及其简单,只需为每个样式表设置一个转换器工厂, 然后得到一个转换器对象, 并告诉它把一个源转换成结果;
File stylesheet = new File(filename);
StreamSource styleSource= new StreamSource(stylesheet);
Transformer t = TransformerFactory.newInstance().newTransformer(styleSource);
t.transform(source, result);
- 8.1)Transform方法的参数是 Source 和 Result 接口的实现类的对象。 Source 接口有4个实现类:
DOMSource
SAXSource
StAXSource
StreamSource
- 8.2)可以从 一个文件, 流, 阅读器或 URL , 以及来自 DOM 树节点的 DOMSource 来构建一个 StreamSource;
- 8.3)用于转换器的SAXSource 是从 XML 阅读器构建的:
t.transform(new SAXSource(new EmployeeReader(), new InputSource(new FileInputStream(filename))), result);
- 8.4)这是一个非 XML 的遗留数据转换成 XML 的一个小技巧。当然, 大多数 XSLT 应用程序都已经有了XML 格式的输入数据, 只需要在 一个 StreamSource 对象上调用transform 方法即可, 如:
t.transform(new StreamSource(file), result);
- 8.5)其转换结果是 Result 接口实现的一个对象, java 库提供了3个类:
DOMResult
SAXResult
StreamResult
- 8.6)如果要把结果存储到 DOM 树中,请使用 DocumentBuilder产生一个新的文档节点, 并将其包装到 DOMResult中:
Document doc = builder.newDocument();
t.transform(source, new DOMResult(doc));
- 8.7)如果要将输出保存到文件中, 请使用 StreamResult:
t.transform(source, new StreamResult(file));