当前位置:编程学习 > html/css >>

XSLT快速参考

1 前言
在计算机科学中,XSLT是扩展样式表转换语言(Extensible Stylesheet Language Transformations)的简称,这是一种对XML文档进行转化的语言,XSLT中的T代表英语中的“转换”(transformation)。它是XSL(Extensiblestylesheetlanguage)规范的一部分。
 
      XSLT是一种用于将XML文档转换为XHTML文档或其他XML文档的语言。 也可以转换成非xml文档,如txt,html, java等等其他文档
 
  XPath是一种用于在XML文档中进行导航的语言。
 
  XSLT指XSL转换(XSLTransformations)。
 
  XSLT是XSL中最重要的部分。
 
  XSLT可将一种XML文档转换为另外一种XML文档。
 
  XSLT使用XPath在XML文档中进行导航。
 
  XPath是一个W3C标准。
 
  XSLT=XSL转换。
 
我们用一个简单的XSLT样式表作为例子介绍了XSLT的概要。当然,XSLT所拥有的元素并不仅限于xsl:template、xsl:apply-templates、xsl:value-of。为了实行转换,XSLT准备了各种各样的元素。本章将以最常用的元素为中心举例说明。
 
另外,本文中并不准备介绍元素的全部属性。详情请参见W3C标准的原文[1]及译文[2]等。
 
在XSLT中经常会用到一种被称为XPath的描述方法。首先从XPath的概要开始介绍。
 
2 XPath是什么?
XPath是树结构的一种描述方法。在创建XSL样式表时经常使用XPath。
 
2.1 树结构
XML文档表示的数据组成数结构。用XLST进行转换,也就是从源文档的树(源树)生成转换后的树(目标树)的意思。这个转换以树结构的节点为基础来进行。
 
节点有几种,主要为:
 
表示根的“根节点”
表示元素的“元素节点”
表示属性的“属性节点”
表示文本的“文本节点”
表示注释的“注释节点”
使用像这样的各种各样的节点来表示树的位置的描述方法称为XPath。
 
2.2 XPath表达式
创建XSLT样式表时经常使用的XPath表达式如表1所示。所谓的上下文节点,就是由上下文构成的节点,可以理解为“处理对象”。另外,今后会出现“当前节点”的概念,可以理解为“被选中的节点”。11
 
表1: 常用的XPath表达式
记号       含义
a      上下文节点的a元素
*     上下文节点的所有元素
a/b   以上下文节点的a元素为父节点的b元素
a//b  以上下文节点的a元素为祖先的b元素
a|b   上下文节点的a元素和b元素
a[表达式]       符合表达式的上下文节点的a元素
.      上下文节点
..     上下文节点的父节点
/      根节点
@a  上下文节点的a属性
@*  上下文节点的所有属性
node()     所有节点
text()      文本节点 描述类似于UNIX的路径描述。例如,
<html> <body> <a href="sample.html">示例</a> <ul> <li>项目A</li> <li>项目B</li> </ul> </body> </html>
中,表示元素a的XPath表达式为
/html/body/a
此外,若表示a元素的href属性,则为
/html/body/a/@href
表中a[表达式]是符合表达式的a项目的意思,例如表示第一个li项目时使用
/html/body/ul/li[1]
 
3 定义样式表的元素
XSLT样式表使用XML文档的格式创建。因此,必须要遵从XML文档的描述规则。XML文档中必须存在的元素只有根元素。在XSLT样式表中的根元素就是xsl:stylesheet元素。基本代码如下所示:
 
<xsl:stylesheet version = "版本号"> <!-- 内容: (xsl:import*, 顶层元素) --> </xsl:stylesheet>
4 模板规则
XSLT样式表可以说是模板规则的集合。
 
4.1 模板规则的定义
模板规则使用xsl:template元素进行定义。它的属性包括match、name、priority和mode。其中最重要的是match属性,该属性规定了节点的样式。若没有指定name属性的话,就必须指定match属性。基本的代码如下所示。
 
<xsl:template match = "样式" name = "名称"> <!-- 内容: (xsl:param*, 模板) --> </xsl:template>
name属性将在调用命名模板时使用。关于命名模版将在后面讲述。
4.2 应用模板规则
我们使用xsl:apply-template元素来应用模板规则。它包含select和mode属性。基本的代码如下所示:
 
<xsl:apply-templates select = "节点集合表达式"> <!-- 内容: (xsl:sort | xsl:with-param)* --> </xsl:apply-templates>
后面将讲到的排序操作等之外的情况下该元素不需要内容,因此空元素标记可以写成以下的形式:
<xsl:apply-templates select="节点集合表达式"/>
未指定select属性时,当前节点为所有的子节点。
通常,仅在处理当前节点的子孙节点时使用该元素。这样就不会发生无法终了的无限循环。不能定义如下例所示的无限循环模版:
 
<xsl:template match="x"> <xsl:apply-templates select="."/> </xsl:template>
4.3 命名模版
带有name属性的模板规则可以通过模版名称来调用。
 
<xsl:call-template name = "名称"> <!-- 内容: xsl:with-param* --> </xsl:call-template>
例如,定义下例所示的模板规则时,
<xsl:template name="hello"> 你好</xsl:template>
可以以下面的方式调用:
<xsl:call-template name="hello"/>
输出为:
你好
4.4 匹配冲突
某个指定的表达式可能会出现多个匹配结果。这时根据优先度来决定应用哪个模板。定义模板规则时可通过设置priority属性来显式地指定模板优先度。如未指定,将采用默认优先度。关于默认优先度的计算方法请参见参考文献[1]。一般来说限制性强的表达式优先度较高。例如“a”的优先度要高于“*”。
 
4.5 内嵌模版规则
内嵌模板规则即为默认模板规则,不匹配任何模板规则的节点将由它来处理。这种机制保证了即使在不定义任何模板规则的情况下,模版处理也能递归地进行下去。
 
应用于元素节点和根节点的内嵌模板规则如下所示。
 
<xsl:template match="*|/"> <xsl:apply-templates/> </xsl:template>
应用于文本节点和属性节点的内嵌模板规则如下所示。
<xsl:template match="text()|@*"> <xsl:value-of select="."/> </xsl:template>
对于其他节点(如注释节点等)不做任何处理。
这种模板规则将把文本节点内容全部输出。将代码1所示的XSLT样式表应用到某个XML文档上之后,将生成以doc为根节点、文本节点为内容的XML文档。
 
代码1: builtin.xsl
<?xml version="1.0"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:template match="/"> <doc> <xsl:apply-templates/> </doc> </xsl:template> </xsl:stylesheet>
5 输出
虽然称为“输出”,但实际的意思是“生成目标树的节点”。可以使用源树生成节点,也可以直接生成节点。
 
5.1 取出文本
xsl:value-of元素可以将指定的节点的值作为字符串来输出。必须要指定select属性。
 
<xsl:value-of select = "字符串表达式"/>
指定的树种包含其它元素时,文本节点以外的节点将被忽略,仅输出文本。例如,
<p>.com时代的<b>IT</b>杂志</p>
对该树应用
<xsl:value-of select="p"/>
时,输出为
.com时代的IT杂志
选择当前节点可以使用“.”。若将
<a href="http://www.gihyo.co.jp"> 技术评论公司</a>
作为当前节点,那么
<xsl:value-of select="."/>的URL是<xsl:value-of select="@href"/>。
的输出为
技术评论公司的URL是http://www.gihyo.co.jp。
5.2 节点复制
xsl:value-of元素将节点的值转换为字符串。与此相对,xsl:copy-of元素将复制节点,节点中包含的子元素原封不动。基本的代码如下所示。
 
<xsl:copy-of select = "表达式"/>
例如、
<p>.com时代的<b>IT</b>杂志</p>
对此应用
<xsl:copy-of select="p"/>
的话,输出为
<p>.com时代的<b>IT</b>杂志<
补充:web前端 , HTML/CSS  ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,