Xsl模板应用基础(一、介绍)

Xsl 的全称是 eXtensible Stylesheet Language,它是专门用于以可读格式呈现Xml数据的语言。它能把Xml数据转换为任意形式的文本数据,如Html、Xml、Json、C#、Sql语句等。由于Xsl 是 Xml 语言的子集,因此 Xsl 的书写格式也必须符合Xml的标准。它继承了Xml语言的中立性,不偏向任何一种编程语言,各大编程语言也对Xsl有良好的支持。甚至可以这样说,Xsl一次编写,到处运行。

Xsl 目前最新版本是 2.0,但是2.0并没有广泛普及开来,.Net framework 还没有找到Xsl 2.0的影子。得益于其强大的扩展能力,从过往几年的使用过程中我感觉1.0版本也足够使用。本系列的文章主要是在1.0的基础上做演示与讲述。

Xsl 的语法非常简单,内置函数也很少,Visual Studio 与 Dreamweaver 也都有语法提示, 因此,对照教程敲一敲代码大概半天时间就能上路应用Xsl了。下图是Xsl应用时的流程图:

各种编程语言都有自己的XML处理器,负责使用Xsl格式化Xml数据,得到最终结果。转换过程还支持传入两种参数,既能传入实体数据(文本、数字、Xml节点),还能传入方法引用,比如把C#的方法传入,供Xsl语言调用,这在后面的文章会有提及。

下面建立student.xml与student.xsl两个文件来做展示。

student.xml:

 1 <?xml version="1.0" encoding="utf-8"?>
 2 <?xml-stylesheet type="text/xsl" href="student.xsl"?>
 3 <root>
 4     <student id="1000">
 5         <name>张三</name>
 6         <sex>male</sex>
 7         <age>16</age>
 8     </student>
 9     <student id="1001">
10         <name>李四</name>
11         <sex>female</sex>
12         <age>15</age>
13     </student>
14     <student id="1002">
15         <name>赵五</name>
16         <sex>male</sex>
17         <age>16</age>
18     </student>
19 </root>

student.xsl:

 1 <?xml version="1.0" encoding="utf-8"?>
 2 <!DOCTYPE xsl:stylesheet  [
 3     <!ENTITY nbsp   " ">
 4     <!ENTITY copy   "©">
 5     <!ENTITY reg    "®">
 6     <!ENTITY trade  "™">
 7     <!ENTITY mdash  "—">
 8     <!ENTITY ldquo  "“">
 9     <!ENTITY rdquo  "”">
10     <!ENTITY pound  "£">
11     <!ENTITY yen    "¥">
12     <!ENTITY euro   "€">
13 ]>
14 <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:msxsl="urn:schemas-microsoft-com:xslt" xmlns:js="http://www.example.com/results" extension-element-prefixes="js msxsl">
15 <xsl:output method="html" encoding="utf-8"/>
16 <msxsl:script language="javascript" implements-prefix="js">
17 <![CDATA[
18 function random(){
19     return Math.random();
20 }
21 ]]>
22 </msxsl:script>
23
24 <xsl:template match="/">
25 <xsl:text disable-output-escaping=‘yes‘>&lt;!DOCTYPE html&gt;</xsl:text>
26 <html>
27     <head>
28         <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
29         <title>学生清单</title>
30         <script>
31             function random(){
32                 return Math.random();
33             }
34         </script>
35     </head>
36     <body>
37         <table border="1" cellpadding="5" cellspacing="0">
38             <tr>
39                 <th>ID</th>
40                 <th>姓名</th>
41                 <th>年龄</th>
42                 <th>性别</th>
43             </tr>
44             <xsl:for-each select="/root/student">
45                 <tr>
46                     <td>
47                         <xsl:value-of select="@id"/>
48                     </td>
49                     <td>
50                         <xsl:value-of select="name"/>
51                     </td>
52                     <td>
53                         <xsl:value-of select="age"/>
54                     </td>
55                     <td>
56                         <xsl:choose>
57                             <xsl:when test="sex=‘male‘">
58                                 <xsl:value-of select="‘男‘"/>
59                             </xsl:when>
60                             <xsl:when test="sex=‘female‘">
61                                 <xsl:value-of select="‘女‘"/>
62                             </xsl:when>
63                             <xsl:otherwise>
64                                 <xsl:value-of select="‘未知‘"/>
65                             </xsl:otherwise>
66                         </xsl:choose>
67                     </td>
68                 </tr>
69             </xsl:for-each>
70         </table>
71
72         Html页面脚本调用随机数:
73         <script>
74             document.write(random());
75         </script>
76         <br/>
77         转换过程调用随机数:<xsl:value-of select="js:random()" />
78         <br/>
79     </body>
80 </html>
81
82 </xsl:template>
83 </xsl:stylesheet>

先看student.xml,唯一特别之处是第二行,有一条处理指令,通知Xml处理器需要引入student.xsl。再看看xsl文件,满眼Html标签,仅有少数 <xsl:xxx> 之类的元素,这是xsl特有的标记,在xsl文件第14行,有xsl命名空间的出处:http://www.w3.org/1999/XSL/Transform,访问该地址,能得到W3C对Xsl技术完整的定义描述。

把这两个文件放到iis站点下,用浏览器访问Xml文件的地址,如http://192.168.1.100/student.xml,得到下图:

Xml 呈现出标准的Html界面,浏览器在此处充当了Xml处理器的角色,IE5.5+,Chrome、Firefox 都支持在客户端解析Xsl语言。如果把student.xml作为页面呈现的主数据(例如学生清单为主体),通过Xsl的document()函数载入同域下的其他Xml片段数据作为辅助数据(例如考试分数Top10、简单报表为侧边栏内容),我们就可以得到数据丰富、表现复杂的页面(印象中以前射手网就是采用这种方法)。这是一种数据与UI完全分离的网页制作方法,适合团队分工合作。

回头再看看student.xsl模板文件,<xsl:for-each select="{XPath}"> 元素通过XPath路径查询语言遍历Xml中的的student元素,并组织Html的结构。关于XPath,http://www.w3school.com.cn/xpath/ 能找到完整的介绍。Xsl中还声明了扩展命名空间urn:schemas-microsoft-com:xslt,前缀(简称)为msxsl,该空间由微软提供支持(就是IE Only),例子中该空间下定义了script元素,指定语言为javascript,由Xml处理器调用该语言的解析引擎实现。如果本案例不通过浏览器处理,而是通过C#提供的Xml处理器执行转换,前面的script元素甚至可以指定语言为C#、vb.net。

script元素中包含一个 random() 随机数方法,请注意它与第31行同名方法的区别,前者在生成HTML过程中执行,后者在HTML生成结束后执行。两者由于运行环境不同,前者不能调用浏览器对象模型(BOM)

本文所举例子(下载例子)旨在介绍Xsl,Xsl完整语法请阅读W3C的教程。文章第一张图是Xsl在实际应用中的流程图,刚上手Xsl时,需紧记流程图中环节,可少走弯路。从过往经验来看,在浏览器端解析Xml数据比较少见,一般都采用后端C#/Java/Php执行转换处理,最终输出HTML字符串。因此本例中Xsl文件内部声明扩展script的做法显得有些另类,一般在后端转换过程传入方法引用供Xsl调用,本系列的后续文章将会专门讲述Xsl的扩展方法。

时间: 2024-10-06 02:28:54

Xsl模板应用基础(一、介绍)的相关文章

Saltstack 基础详细介绍

1.saltstack 基础详细介绍  Saltstack使用Python开发,是一个非常简单易用和轻量级的管理工具.由Master和Minion构成,通过ZeroMQ进行通信    Saltstack的master端监听4505与4506端口,4505为salt的消息发布系统,4506为salt客户端与服务端通信的端口:salt客户端程序不监听端口,客户端启动后,会主动连接master端注册,然后一直保持该TCP连接,master通过这条TCP连接对客户端控制,如果连接断开,master对客户

PHP模板引擎smarty详细介绍

篇文章主要介绍了PHP模板引擎smarty详细介绍,本文讲解了什么是smarty.smarty优点.不适合使用smarty的地方.smarty目录结构及版本,需要的朋友可以参考下 /* 一.什么是smarty? smarty是一个使用PHP写出来的模板PHP模板引擎,它提供了逻辑与外在内容的分离,简单的讲, 目的就是要使用PHP程序员同美工分离,使用的程序员改变程序的逻辑内容不会影响到美工的页面设计,美工重新修改页面不会影响到程序的程序逻辑,这在多人合作的项目中显的尤为重要. 二.smarty优

足彩基础知识入门(4)赛事数据库与预测平台基础概念介绍(一)

在足球赛事数据库以及统计分析预测平台中,有很多概念,如果不搞懂,很难进行下一步的工作.所以为了配合团队人员的学习和任务进行,特意编写这篇文章.如果有其他问题和不懂的,请留言,将根据情况进行更新. 本文原文地址:足彩基础知识入门(4)赛事数据库与预测平台基础概念介绍(一) 1.指数1/2/3.... 我在 足彩基础知识入门(3)足彩赔率的本质 一文中介绍了赔率的概念,那么指数的概念和赔率以及结果是相关的.我们举个例子: 如上图的比赛,前面是竞彩非让球的赔率:1.74-3.25-4.15,也就是说

C++模板(基础)

本文转至:http://www.cnblogs.com/gw811/archive/2012/10/25/2738929.html C++模板 模板是C++支持参数化多态的工具,使用模板可以使用户为类或者函数声明一种一般模式,使得类中的某些数据成员或者成员函数的参数.返回值取得任意类型. 模板是一种对类型进行参数化的工具: 通常有两种形式:函数模板和类模板: 函数模板针对仅参数类型不同的函数: 类模板针对仅数据成员和成员函数类型不同的类. 使用模板的目的就是能够让程序员编写与类型无关的代码.比如

view基础知识介绍(二)

view基础知识介绍 View的滑动 View的滑动可以通过三种方式来实现: 通过view本身提供的scrollTo和scrollBy方法 通过动画施加平移效果来实现 通过改变view的LayoutParams使得view重新布局来实现 scrollTo/scrollBy ①. 通过查看view的源码 我们可以发现 scrollBy方法其实也是调用了scrollTo方法来实现的 scrollTo方法是基于所传递参数的绝对位置滑动 而scrollBy是根据所传递参数基于当前未知的滑动 通过源码可知

自动化运维系列之Ansible的YAML、基础元素介绍

自动化运维系列之Ansible的YAML.基础元素介绍 YAML简介 YAML是一种用来表达资料序列的格式.YAML是YAML Ain't Markup Lanaguage的缩写,即YAML不是XML. 特点 1.具有很好的可读性,易于实现: 2.表达能力强,扩展性好: 3.和脚本语言的交互性好: 4.有一个一致的信息模型: 5.可以基于流来处理. YAML语法 YAML的语法和其他语言类似,也可以表达散列表.标量等数据结构. YAML结构通过空格来展示:序列里的项用"-"来代表:Ma

NLP汉语自然语言处理入门基础知识介绍

NLP汉语自然语言处理入门基础知识介绍 自然语言处理定义: 自然语言处理是一门计算机科学.人工智能以及语言学的交叉学科.虽然语言只是人工智能的一部分(人工智能还包括计算机视觉等),但它是非常独特的一部分.这个星球上有许多生物拥有超过人类的视觉系统,但只有人类才拥有这么高级的语言. 自然语言处理的目标是让计算机处理或说"理解"自然语言,以完成有意义的任务,比如订机票购物或QA等.完全理解和表达语言是极其困难的,完美的语言理解等效于实现人工智能. 自然语言处理涉及的几个层次: 作为输入一共

TCP_Wrappers基础知识介绍

1. TCP_Wrappers基础知识介绍 TCP_Wrappers是在 Solaris, HP_UX以及 Linux中广泛流行的免费软件.它被设计为一个介于外来服务请求和系统服务回应的中间处理软件.最常见的用法是与inetd一起使用.当系统的Inetd接收到一个外来服务请求的时候,并不是直接调用,而是调用TCP_Wrappers(可执行文件tcpd),TCP_Wrappers根据这个所请求的服务和针对这个服务所定制的存取控制规则来判断对方是否有使用这个服务的权限,如果有,TCP_Wrapper

Swift Playgrounds for mac基础知识介绍

Swift Playgrounds是一款适用于iPad和Mac的革命性应用程序,它使Swift学习变得互动而有趣.它不需要编码知识,因此非常适合刚开始的学生.使用Swift解决难题,以掌握基本知识.Swift是Apple创立的一种强大的编程语言,专业人士用来构建当今最受欢迎的应用程序.在本篇文章中,我们介绍的是Swift Playgrounds for mac基础知识. [dl]15-6298[/dl] 首先我们来认识一下基本的操作: 掌握基础知识,然后面对更多挑战.除了内置的课程库之外,Swi