一 、 概念
XSL(eXtensible Stylesheet Language),即可扩展样式表语言,是一套转换xml的标准。
xsl由两部分组成:一、转化xml的文档(XSLT);二、是格式化xml文档(XTL-FO)
小解:XSL在转换XML文档时分为明显的两个过程,第一转换文档结构;其次将文档格式化输出。这两步可以分离开来并单独处理,因此XSL在发展过程中逐渐分裂为XSLT(结构转换)和XSL-FO(formatting objects)(格式化输出)两种分支语言,其中XSL-FO的作用就类似CSS在HTML中的作用。而我们这里重点讨论的是第一步的转换过程,也就是XSLT。
换成通俗的说法就是:XSL是一种可以将XML转化成HTML的语言,一种可以过滤和选择XML数据的语言,一种能够格式化XML数据的语言。(比如用红色显示负数。)
二、图解
显示xml的过程
三、XSL转换
1、XSLT概念
是一种用来转换XML文档结构的语言。
XPath隶属XSTL,是一种专门用来在XML文档中查找信息的语言。
2、XSLT用途
主要用途就是数据转换应用。
3、XSLT如何转换
将XML原文档输入,用XSL作为模板,通过转换引擎,输出需要的HTML文档。
4、XSLT元素语法
(1). <xsl:template ><!--执行内容--> </xsl:template>。 模板是其重要概念之一任何一个XSLT文件至少包含一个模板
(2). <xsl:value-of select ="XML标签名"/> 。用来将原文档中的值写到输出文档中,同样功能的还有:xsl:cope-of
(3). <xsl:for-each select="循环条件"> template body </xsl:for-each>。允许你循环处理被选择的节点。
(4). <xsl:if test=布尔表达式 > template body </xsl:if> 节点满足某个条件时,被模板处理。(没有else属性)
(5). <xsl:when> < xsl:choose>
(6). <xsl:sort select="@xml标签名">对xml原文档进行重新排序,
5、XPath 语法
XPath是用来帮助XSLT在XML原文档中查找定位信息的语言。
(1). 当前位置
使用Context来表示当前正在被模板处理的节点位置;
(2). 寻址操作
Axis 和Predicate是XPath语法中对Location Paths进行定位操作的语法。
(3). 运算符
and/or/=/!=/>/>=/</<=/ + - * div加减乘除/mod取模/|两个节点一起算
(4). 功能函数
count( ) 统计计数
number( ) 文本转换为数值
substring( ) 截取字符串
sum( ) 求和
四、XSL格式化对象
1 . XSL-FO 文档
定义关于页面的实际大小信息;页边距、页脚页眉;字体大小颜色;实际文本信息,如段落、突出信息、表格。
2 . 将XML文档转换为PDF文件
两个步骤:
a.用 XSLT 样式表将 XML 文档转换为由 XSL-FO元素构成的文件。要执行这一转换,只需用 XML 文档和样式处理器。
b.用某种显示引擎(例如上图示例中使用的FOP,即格式化对象转换为 PDF,FormattingObjects to PDF)将 XSL-FO 元素转换为 PDF 文件。这个步骤甚至更简单:您只需调用FOP 工具,将 XSL-FO 文件的名称和 PDF 文件的名称传递给它即可。
3. XSL-FO 的元素语法
<fo:root> 根元素;
<fo:layout-master-set> 指定页面定义;
<fo:simple-page-master> 定义特定页面布局;
<fo:region-body> 定义页面正中的区域;
<fo:page-sequence> 定义页面内使用页面布局的序列;
<fo:flow> 定义了当前页边距、字体设置等……;
<fo:block>和<fo:inline> 格式化文本块 和 定义新的文本特性。
五、XSLT 应用扩展
1.从XSLT样式表调用javascript
2.定制命名空间
3.定制函数
4.绑定外部java函数
5.从XSTL样式表调用java
六、实例解析
银行扣款回盘处理——回盘源文件
- ATNU:0019999
- MICN:14858
- CUNM:代发工资临时存款户
- MIAC:0702014830000464
- TRDT:20020614
- ---------------------------
- 0200004201000299266|301.00|张成伟|86110020030310000173|
- ---------------------------
- 0200254501000895146|600.00|李志林|86110020030310000211|EAG1024|账号户名不符|
- 0200254501000895146|400.00|李志林|86110020030360000153|EBK7732|余额不足|
银行扣款回盘处理——XSL文件
- <?xml version="1.0" encoding="iso-8859-1"?>
- <xsl:stylesheet xmlns:xsl=http://www.w3.org/1999/XSL/Transform
- xmlns:xalan="http://xml.apache.org/xalan"
- xmlns:java="http://xml.apache.org/xslt/java"
- exclude-result-prefixes="java"
- version="1.0">
- <xsl:include href="return_function.xsl"/>
- <xsl:template match="/">
- <BANKDATA>
- <xsl:for-each select="BANKDATA/ROW">
- <xsl:choose>
- <xsl:when test="string(xalan:tokenize(COLUMN, '|')[2])=''">
- </xsl:when>
- <xsl:otherwise>
- <ROW>
- <xsl:for-each select="//BANKDATA/ROW">
- <xsl:if test="substring(COLUMN, 1, 4)='TRDT'">
- <BankDealDate type="text">
- <xsl:value-of select="concat(substring(substring(COLUMN, 6, 8),1,4), '-', substring(substring(COLUMN, 6, 8),5,2), '-', substring(substring(COLUMN, 6, 8),7,2))"/>
- </BankDealDate>
- </xsl:if>
- </xsl:for-each>
- <!-- 账号 -->
- <AccNo type="text"> <xsl:value-of select="xalan:tokenize(COLUMN, '|')[1]"/> </AccNo>
- …………………………………
- …………………………………
- <!-- 交易状态 -->
- <xsl:choose>
- <xsl:when test="string(xalan:tokenize(COLUMN, '|')[5])=''">
- <BankSuccFlag type="text"> <xsl:value-of select="'9999'"/> </BankSuccFlag>
- </xsl:when>
- <xsl:otherwise>
- <BankSuccFlag type="text"> <xsl:value-of select="xalan:tokenize(COLUMN, '|')[5]"/>
- </BankSuccFlag>
- </xsl:otherwise>
- </xsl:choose>
- </ROW>
- </xsl:otherwise>
- </xsl:choose>
- </xsl:for-each>
- </BANKDATA>
- </xsl:template>
- </xsl:stylesheet>
银行扣款回盘处理——转换结果
- <BANKDATA>
- <ROW>
- <BankDealDate>2002-06-14</BankDealDate>
- <AccNo>0200004201000299266</AccNo>
- <PayMoney>301.00</PayMoney>
- <AccName>张成伟</AccName>
- <PayCode>86110020030310000173</PayCode>
- <BankSuccFlag>9999</BankSuccFlag>
- </ROW>
- <ROW>
- ………………………………
- </ROW>
- </BANKDATA>
银行扣款回盘处理——处理过程
导入Java处理相关包
- import org.w3c.dom.*;
- import javax.xml.parsers.DocumentBuilder;
- import javax.xml.parsers.DocumentBuilderFactory;
- import javax.xml.transform.Source;
- import javax.xml.transform.Result;
- import javax.xml.transform.dom.DOMSource;
- import javax.xml.transform.dom.DOMResult;
- import javax.xml.transform.TransformerFactory;
- import javax.xml.transform.Transformer;
- import javax.xml.transform.stream.StreamSource;
构建Document对象,形成临时XML数据
- dataDoc = buildDocument(); //Declare the document
- Element dataRoot = dataDoc.createElement("BANKDATA"); //创建根标签
- while(true) { //循环获取每一行
- strLine = in.readLine();
- if (strLine == null) break;
- strLine = strLine.trim();
- if (strLine.length() < 3) continue; //去掉空行
- //Create the element to hold the row
- Element rowEl = dataDoc.createElement("ROW");
- Element columnEl = dataDoc.createElement("COLUMN");
- columnEl.appendChild(dataDoc.createTextNode(strLine));
- rowEl.appendChild(columnEl);
- //Add the row element to the root
- dataRoot.appendChild(rowEl);
- }
- //Add the root to the document
- dataDoc.appendChild(dataRoot);
通过XSL对XML进行转换
- resultDoc = buildDocument(); //Declare the document
- File fStyle = new File(xslPath); //读入XSL文件
- Source source = new DOMSource(dataDoc);
- Result result = new DOMResult(resultDoc);
- Source style = new StreamSource(fStyle);
- //Create the Transformer
- TransformerFactory transFactory = TransformerFactory.newInstance();
- Transformer transformer = transFactory.newTransformer(style);
- //Transform the Document
- transformer.transform(source, result);
七、实时调试
1.xsl:message 通常是快速调试的最佳解决方案。可以采用各种形式:弹出对话框、日志文件或者标准错误输出标记。缺点是没有其输出的标准规范。是一个标准指令可以跨处理器移植。
2.调试技巧
简单消息:xsl:value-of 将其选择表达式的结果转换成集合中第一个节点的明文字符串表示
xsl:copy-of 真正将所有节点都完整地复制到消息主体中,作为完整的标记。
显示上下文:
内省器小控件:使用XSTL处理器支持EXSLT标准XSLT扩展的dyn模块。
八、参考网址
- XML (http://www.w3.org/TR/1998/REC-xml)
- Extensible Markup Language 1.0, W3C Recommendation
- XSL (http://www.w3.org/TR/xsl)
- Extensible Style Language 1.0, W3C Proposed Recommendation
- XSLT (http://www.w3.org/TR/xslt)
- XSL Transformations 1.0, W3C Recommendation
- XPath (http://www.w3.org/TR/xpath)
- XML Path Language 1.0, W3C Recommendation