XSL语言

概念

XSL(eXtensible Stylesheet Language),即可扩展样式表语言,是一套转换xml的标准。

 

xsl由两部分组成:一、转化xml的文档(XSLT);二、是格式化xml文档(XTL-FO

 

小解:XSL在转换XML文档时分为明显的两个过程,第一转换文档结构;其次将文档格式化输出。这两步可以分离开来并单独处理,因此XSL在发展过程中逐渐分裂为XSLT(结构转换)XSL-FO(formatting objects)(格式化输出)两种分支语言,其中XSL-FO的作用就类似CSSHTML中的作用。而我们这里重点讨论的是第一步的转换过程,也就是XSLT         

换成通俗的说法就是:XSL是一种可以将XML转化成HTML的语言,一种可以过滤和选择XML数据的语言,一种能够格式化XML数据的语言。(比如用红色显示负数。)

 

二、图解

 显示xml的过程

 


 

三、XSL转换

1XSLT概念

是一种用来转换XML文档结构的语言。

XPath隶属XSTL,是一种专门用来在XML文档中查找信息的语言。

2XSLT用途

主要用途就是数据转换应用。

3XSLT如何转换


 

XML原文档输入,用XSL作为模板,通过转换引擎,输出需要的HTML文档。

4XSLT元素语法

(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原文档进行重新排序,

5XPath 语法

XPath是用来帮助XSLTXML原文档中查找定位信息的语言。

(1). 当前位置

使用Context来表示当前正在被模板处理的节点位置;

(2). 寻址操作

Axis PredicateXPath语法中对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,即格式化对象转换为 PDFFormattingObjects 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);

通过XSLXML进行转换

  •       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模块。

八、参考网址

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值