XML—— XSL 转换

【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));
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值