XML文档的一大特点是可以向多种格式的文档进行转换。比如,从一种逻辑结构的XML向另一种逻辑结构的XML转换,或是转换为可浏览的HTML文档等。这种XML文档的数据格式转换功能由可扩展样式单语言(XSL)完成。
北京邮电大学 张剑
--------------------------------------------------------------------------------
一、XML文档转换原理
数据格式转换的重要思想是要把XML文档视为一种树结构,转换的过程就是从源树生成结果树的过程。XSL样式单定义了源树和结果树中对应部分的转换规则,每条规则中包含了一个模板,并对应着一种模式。模板定义了转换的结果,而模式则规定了需要进行转换的元素或属性对象。
XML中引用XSL的语法格式如下:
如果在声明部分引用了多个XSL样式单,则只有第一个样式单会生效,其余的都会被忽略掉。
XSL的格式转换功能在复杂的电子商务解决方案中大有用武之地。比如,A公司和B公司都是生产机器零件的厂家,在货物清单中都包含了产品序列号以及质量等级评分。A公司的文件格式如下:
而B公司的文件格式有所不同,相关信息都出现在元素的属性中:
这样,虽然两个公司的产品完全一样,但由于文档格式的差异给双方的贸易往来设置了障碍。而使用XSL样式单可以轻松地把A公司的文档转换成B公司的格式,反之亦然。
二、XML文档转换步骤
XML文档的转换过程分为两步:
● 首先是根据XML文档构造源树,然后根据XSL规则将源树转换为结果树。目前,这种转换协议已经日趋完善,并从XSL中独立出来,成为W3C正式推荐的标准,称为XSLT(XSL Transformations);
● 生成结果树后,就可以对其进行解释,产生一种适合显示、打印或是播放的格式,这一步称为格式化(Formatting)。
XSL处理器负责实现转换过程。首先,XML文档被解析成DOM树存放在内存中,接着对文档进行分析,每一个DOM树中的节点都会与一个模式相比较,当二者匹配时,就会按照模板中定义的规则进行转换,否则继续往下匹配。如此循环,直至整个文档处理完毕。
三、XSL文档标准格式
XSL文档的标准格式如下:
template rule i
output template
XSL文档本身是格式良好的XML文档,所以在书写时要注意标签的匹配问题。
四、XSL的语法结构
XSL的逻辑语法结构包括循环和条件判断。这两种结构使用户能够灵活地书写转换规则。循环判断是通过
......
条件判断结构分为if语句和Case语句两种形式。if语句是简单地对条件进行判断,结果为真就执行条件内部的规则,因此可以把if条件与简单的布尔表达式联合使用。下面这个例子就是对薪水超过100万元的职员输出“Overpaid employee”信息:
Overpaid employee
Case语句是对多种情况的分支判断。该语句包括
No tax
High tax rate
五、XSL的模板规则
output template for root element
然后匹配其他节点,此时,只要在引号中指明要处理的元素对象名称即可。如果在引号中出现的是“*”,那么表示该规则适用于所有的未单独指定处理的元素节点。比如下例中的第二个模板就表示要处理除
output template
output template
此外,XSL中还可以使用路径指示符来指定一些特殊位置的元素与模板相匹配。“//”代表任意深度位置,如
很显然,某些树节点在XSL中可能会对应多个模板,在这种情况下,只有最后一个对应模板会生效,前面的模板规则都会被XSL处理器忽略掉。
一、XSL模板的使用
XSL在输出模板中描述输出格式,这些格式可以是各种字符串、标签符号、节点值或者是一些XSL语法结构,如条件判断、循环处理等。在许多应用场合中,输出模板中需要使用节点的取值,此时可以根据需要使用
上述第一个表达式匹配的对象是当前节点的所有子节点中名称为
在确定了模板规则与元素相匹配之后,就可以激活模板,这项任务由
直接使用
上述第一个模板与XML文档的根元素相匹配,并对根节点以下的所有 标签作为空白段落,接着对 二、XSL的扩展规则 1. 路径指示符 除了前面介绍的“//”和“/”路径指示符,以及统配符“*”,还有几个符号可以用来对模板的匹配对象进行限制: ● 当前节点指示符为“.”; ● 父节点指示符为“..”; ● 属性指示符为“@”。 上述“@”表示对指定元素中的某个属性进行匹配,如 2. 过滤匹配符 除了路径指示符之外,还可以对作用对象进行条件过滤或是排序,以进一步调整应用效果。过滤时,一般是以子元素(或属性)是否存在(或其取值)为标准: ● 子元素存在:即//Employee[Salary]存在,选择含有 ● 子元素取值:即Employee[Salary > 25000],选择含有 ● 属性存在: 即Employee[@ID]存在,选择含有 ● 属性取值: 即Employee[@ID =“1234”],选择所有属性ID值为1234的 3. 其他扩展过滤 其他的一些附加功能的过滤符,按功能分为:比较操作符、布尔操作符和集合索引。 比较操作符的书写格式和功能如下所示: 操作符 功能 $eq$ 等于 $ne$ 不等 $lt$ 小于 $le$ 小于或等于 $gt$ 大于 $ge$ 大于或等于 需要说明的是:表格中的操作符在比较字符时对大小写是敏感的,如果要忽略大小写的不同含义,在每个操作符前面加上前缀字母“i”即可,如“$ieq”。 布尔操作符书写格式和功能说明如下: 操作符 功能 $and$ 逻辑与 $or$ 逻辑或 $not$ 取非 对过滤的结果可以通过集合索引进行再过滤。例如,Employee[Salary][2]就是选择第2个含有 Employee[index() $lt$ 2] Employee[end()] 上述第一个表达式的选择结果是 order-by=“number(Salary)”/> 上述第一个例子表示应按姓名的字母升序排列,比如“Bob”应当排在“Tom”之前,而第二个例子则表示按照薪水的多少对职员进行排序。

