1、XSLT 基础XSL 与 XSLTXSL 指扩展样式表语言(EXtensible Stylesheet Language)。它主要被用来对 XML 文档进行格式化,与 CSS 不同,XSL 不仅仅是样式表语言 XSL 主要包括三个部分: XSLT 一种用于转换 XML 文档的语言。 它可以将一个 XML 文件转换成另一种格式的 XML 文件或 XHTML 文件. XPath 一种用于在 XML 文档中导航,定位元素的语言。 XSL-FO , 可扩展样式表语言格式化对象(Extensible Stylesheet Language Formatting Objects) ,用于格式化供输出的 X
2、ML 数据。XSL-FO 目前通常被称为 XSL (尽管这算是一种误解,但这样说是可以的,因为在格式化 XML 方面,XSL-FO 起着和 CSS 一样的作用!) XSLT 指 XSL 转换(XSL Transformations)。 它是 XSL 中最重要的部分。通过 XSLT,您可以向或者从输出文件添加或移除元素和属性。您也可重新排列元素,执行测试并决定隐藏或显示哪个元素,等等。描述转化过程的一种通常的说法是,XSLT 把 XML 源树转换为 XML 结果树。书写 XSLTXSLT 文件本身也是 XML 文件,一般 以.xml .xsl .xslt 几种文件后缀名保存.XSLT 遵循 XM
3、L 的语法,文件开头一般都加有 XML 声明,XML 声明之后是文档根元素 stylesheet 或 transform(两者之一),并且使用 version 属性声明 XSLT 版本,目前版本是 1.0,2.0 还在草案中,XSLT 的所有内置元素都从属于“http:/www.w3.org/1999/XSL/Transform“命名空间,所以应该在文档根元素上声明一个 xsl 或 xs 的命名空间! 上面创建了一个最基本的 XSLT 文件,将其应用于任何 XML 文档,在支持XSLT 的浏览器打开该 XML 文档,会看到所有的文档显示了出来,而标签没有了!事实上,在浏览器中真正显示的是 HT
4、ML,XSLT 将 XML 转换成了 HTML.我们可以更进一步指定转换成 HTML 的版本,比如转换成 XHTML!output 元素定义输出文档的格式。method 属性可接受xml,html,text,name 四种格式;version 设置输出格式的 W3C 版本号(仅在 method=“html“ 或 method=“xml“ 时使用); encoding 设置输出中编码属性的值(对于 HTML 将会输出成 charset 的值); doctype-public 规定 DTD 中要使用的公共标识符; doctype-system 规定 DTD 中要使用的系统标识符; indent 规
5、定在输出结果树时是否要增加空白,该值必须为 yes 或 no。template 模版可以用 template 来定义模版.template 元素必须有 match 或 name 两个属性之一或两者都有,match 属性用以并联 XML 中的元素,其值为一个 XPath 表达式,XPath 表达式所选取的元素会被应用模版而进行转换. name 属性为模版定义名称,用以在其它地方引用.一个 template 元素里面包含的是一些将被输出的HTML 或 XML 标签. Name对于使用一个没有任何模版的 XSLT 的 XML 文件,在浏览器中显示时只是简单的将其中的文本显示出来,应用了上面的 XSL
6、T 之后,根元素 bank 下面子元素p 的子元素 name 的值都将会显示成一个加粗的 Name!而其它的则只是普通的文本.但这样并没有什么意义,我们还可以更进一步,将被 XPath 表达式“/bank/p/name“选取的元素的值显示出来-value-of 元素!value-of 元素的 select 属性是必须的,属性值是一个 XPath 表达式,指定一个节点(如果是多节点,value-of 中会获取第一个节点的值),然后将其里面的文本输出!将上面的模版替换成下面的,输出后就会将所有的 name 加粗!注意,任何正文内容的输出都应该放在 template 元素里面! 注意上面的 valu
7、e-of 的 select 是使用的 “.“ ,而没有使用“/bank/p/name“,因为“/bank/p/name“返回的是所有的 name 元素,“ . “表示模版当前应用的那个元素!可以定义多个模版,如下:-当多个模版的 match 表达选取节点重叠时,后出现的模版的格式会覆盖先出现的,可以使用 template 元素的 priority 属性对模版的优先组进行编号,其值是一个数字,越大优先级越高! 这样,便给 name,age,money 这些元素都进行了格式化输出,但现在输出的HTML 代码顺序仍然是按照在 XML 源文件中出现的顺序出现的.当需要对整个 XML文档进行格式化输出的
8、时候,可以将 match 属性设为“/“使用上面的模版,将会使 XML 文档在浏览器中没有任何输出.可以在应用于根节点的模版中加上 HTML 标签,以输出完整的 HTML 文档!XSLT一个 HTML 页面这样,即使定义了其它模版,它们的输出也不会出现在浏览器中,因为上面的模版覆盖了其它应用于子节点的模版的输出,要在其中包含其它模版的内容,可以使用 XSLT 的 apply-templates 元素来应用模版,该元素有两个属性,select属性值是一个 XPath 表达式,XPath 表达式选取的节点及其子节点将被应用模版. 如果没有为这些节点定义模版,则直接输出节点的值.如果 apply-t
9、emplates 元素不指定 select 属性,则将给当前节点(template 元素的 match 属性所匹配的节点)的所有后代节点应用模版,如果没有定义模版,则直接输出所有节点的值. 下面的代码将直接输出所有节点的值XSLT 中有一个规定:如果一个节点没有任何可用的 template,则将这个节点中所有文本节点的值返回! 可以指定 select 属性,指明哪些节点将应用模版并输出在这个地方,这样就可以不以 XML 源文件中的顺序输出数据了!还可以使用 call-template 调用指定的模版,call-template 元素的 name属性指定要调用模版的 nameattribute
10、给元素添加属性使用 attribute 元素,可以在转换时给元素动态添加属性!其语法很简单,下面是一个给 img 元素添加值为“test.jpg“的 src 属性的代码:test.jpgfor-each 节点遍历XSLT 中的 for-each 元素允许您在 XSLT 中进行循环。该元素的 select 属性与其它元素的 select 属性一样,其值是一个 XPath 表达式,被 XPath 表达式选取的元素将被遍历!上面的代码将遍历所有根元素 bank 的子元素 p 的 name 子元素并加以格式化后输出它的值. 注意,value-of 元素的 select 的值“.“表示选取当前节点,在f
11、or-each 的内部,当前节点为 for-each 当前遍历到的节点! sort 排序sort 元素用于对结果进行排序。sort 元素需要放在 for-each 元素内部.sort 元素的 select 属性值为选取排序依据节点的 XPath 表达式,data-type 属性有两个取值(text|number),指明是按字母顺序排序还是按数字大小排序! 另外,它还有个 order 属性,可以指定是按正顺还是倒序排序,取值为(ascending|descending),默认是 ascending(正序)!if 条件测试在 XSLT 中还可以使用 if 元素进行条件判断,该元素的 test 属性
12、值为一个条件测试 XPath 表达式,当值计算结果是真的时候才处理 if 元素中的内容!上面的代码用以输出 money 排前三名的成年人. 注意,在 if 元素的 test 属性中,XPath 表达中的一些特殊字符(如大于和小于)必须写成实体引用!choose when.otherwise. 多重条件测试出于习惯,见到 if 语句可能会想到 if.else 语句,但 XSLT 中并没有if.else 语句,取而代之的是即有 if.else 功能,又有 switch.case 功能的choose 元素,choose 元素有两个子元素 when 与 otherwise,相当于 else if 与e
13、lse ,或者,when 相当于 case 语句,otherwise 相当于 default.when 元素的test 属性值同样是一个 XPath 表达式,当这个表达式返回真的时候,when 的子元素才会显示!otherwise 没有 test 属性,当所有的 when 元素的 test 都失败后,处理 otherwise 子元素!PHPer 就是 PHP 程序员的意思!好好 Coding,天天向上!不懂!其它人浏览器中的 XSLT只要有 XML 与 XSLT 解释引擎,就可以在任何地方使用任何语言利用 XSLT将 XML 转换成 HTML 或其它文档,并且使用不同的语言并不会影响转换结果.
14、也就是说,这种转换是与语言无关的,既可以在服务器端进行转换后,返回 HTML 页面,也可以客户端进行转换,它们的效果都是一样的.而且在客户端对 XML 文件进行转换,可以减轻服务器的负担.在一个引入了 XSLT 文件的 XML 文件,浏览器会自动对其进行转换.但是,XML一般并不是在浏览器中显示,而是用来读取数据.当使用其它语言来手动转换时,需要将 xml-stylesheet 这样的 PI 去掉,这样,XML 文件可使用多个不同的 XSL 样式表来进行转换,增加了灵活性。IE 中的 XSLT与 IE 支持 XML DOM 一样,IE 中 XSLT 相关 API 显得十分简单,同时 IE 对X
15、SLT 的支持也很有限!下面是在 IE 中将一个 XMLDOM 使用 XSLT 转换成 HTML 的示例:/载入 XML 数据文件var xml = new ActiveXObject(“Microsoft.XMLDOM“);xml.async = false;xml.load(“test.xml“);/载入 XSLT 文件,XSLT 也是作为 XML 文件载入的var xsl = new ActiveXObject(“Microsoft.XMLDOM“);xsl.async = false;xsl.load(“test.xsl“);/直接在要转换的 DOM 上调用 transformNode
16、 方法,传入XSLT DOM,返回字符串document.write(xml.transformNode(xsl);Mozilla 中的 XSLT与 Mozilla 对 XML DOM 的支持一样,它对 XSLT 的支持更标准但更复杂!Mozilla 使用一个 XSLTProcessor 对象来处理与 XSLT 有关的转换./载入 XML 数据var xml = document.implementation.createDocument(“,“,null);xml.async =false;xml.load(“test.xml“);/载入 XSLTvar xsl = document.imp
17、lementation.createDocument(“,“,null);xsl.async =false;xsl.load(“test.xsl“);/创建 XSLTProcessorvar xslPro = new XSLTProcessor();xslPro.importStylesheet(xsl);/导入 XSLT/使用 transformToDocument 将 XML 按 XSLT 进行转换,返回新文档的 DOMvar result = xslPro.transformToDocument(xml);/要将返回的 DOM 转换成字符串,还要使用 XMLSerializer 对象var serializer =new XMLSerializer();var html = serializer.serializeToString(result);document.write(html);