XSLT编程风格、功能、局限及工具全解析
立即解锁
发布时间: 2025-09-07 00:57:18 阅读量: 15 订阅数: 21 AIGC 


XML系统架构与应用
### XSLT编程风格、功能、局限及工具全解析
#### 1. XSLT编程风格
XSLT有两种编程风格:过程式编程风格和基于规则的编程风格,当然也可以混合使用这两种风格。
##### 1.1 过程式编程风格
过程式编程风格也被称为“拉取”模型。在这种风格中,程序员要精确地向XSLT处理器描述要做什么以及按什么顺序做。对于熟悉命令式语言(如C或Pascal)的程序员来说,这种风格更容易理解。XSLT样式表看起来很像目标文档,其中穿插着XSLT指令来填充空白,这与Java Server Pages (JSP) 的编程方法类似。
过程式XSLT指令包括以下操作:
- **控制结构**:像`xsl:for-each`、`xsl:if`和`xsl:choose`这样的XSLT指令提供了条件执行或循环等过程式控制结构。可以使用`xsl:sort`指令对`xsl:for-each`指令的结果进行排序,还可以使用`xsl:number`指令对结果进行编号。
- **访问内容**:`xsl:value-of`指令将当前节点(或显式指定的节点)的内容写入目标文档。
- **按名称调用**:可以通过`xsl:call-template`指令调用命名模板,类似于在主流编程语言中调用子程序。可以向这些模板传递参数,但不能返回结果值。
下面是一个使用过程式编程风格将书籍订单示例转换为HTML的XSLT示例:
```xml
<!-- 此处省略具体示例代码,可根据实际情况补充 -->
```
##### 1.2 基于规则的编程风格
基于规则的编程风格也被称为“推送”模型,是一种更具声明性的方法。规则描述了输入文档的元素应该如何转换,规则基于模式匹配机制递归应用。对于非程序员和熟悉声明性语言(如PROLOG、专家系统等)的程序员来说,这种方式更容易上手。
基于规则的转换中,主要的XSLT控制元素是模板 (`<xsl:template>`)。每个模板由头部和主体组成。模板的头部通过`match=`属性和指定的XPath表达式来选择上下文节点,从而决定模板在什么上下文中激活;模板主体则使用XSLT指令描述要执行的操作。
基于规则的操作包括:
- `xsl:apply-templates`指令递归地应用样式表中定义的所有模板,但只应用于`select=`属性选择的上下文中的节点。
- `xsl:apply-templates`还可以配备一个可选的`mode`属性,这样可以根据上下文应用不同的模板集,因为模板也可以配备必须匹配的`mode=`属性。
- 可以使用`xsl:sort`指令对`xsl:apply-templates`指令的结果进行排序,使用`xsl:number`指令对结果进行编号。
- 过程式XSLT指令可用于条件处理或将内容写入目标文档。
当多个模板的头部匹配某个上下文时,会选择匹配度最高的模板执行:
- 当前样式表中的模板优先于导入样式表中的模板。
- 模板头部的匹配表达式越具体,匹配度越好。
下面是一个基于规则的示例样式表,它产生的输出与前面的过程式样式表相同:
```xml
<!-- 此处省略具体示例代码,可根据实际情况补充 -->
```
#### 2. 过程式与基于规则编程风格对比
虽然两种样式表产生相同的输出,但它们实际上定义了不同的转换。当重新排列输入文档中的元素时,可以看到差异。如果将`<note>`元素放在`<orderlist>`元素后面,过程式样式表的输出文档不会受到影响;而在基于规则的样式表中,“Please note: ...”输出会出现在表格之后。这是因为在基于规则的样式表中,转换是以声明性的方式定义的,输入文档驱动处理顺序,因此输入文档的布局决定了输出文档的布局;而在过程式样式表中,输出文档的布局由样式表的布局决定。
#### 3. XSLT的功能
##### 3.1 变量
XSLT有变量,但这些变量是只读变量。变量的值在定义时分配,之后不能修改。模板也可以将变量指定为形式参数,从而可以向模板传递参数。
##### 3.2 键
一些XML文档大量使用交叉引用。XSLT提供了一个额外的结构来简化此类结构的导航:
```xml
<xsl:key
name="mykey"
match="//author"
use="@aid"/>
```
这个结构为文档施加了一个新的键结构。然后可以在其他XPath表达式中使用这个键,例如`key("mykey","1")/name`会得到`@aid="1"`的作者的姓名。
##### 3.3 多输入文件
`document()`函数允许通过将其他文档的URI作为参数来访问这些文档。
##### 3.4 各种输出方法
XSLT可以将XML文档树结构转换为另一种XML文档树结构。默认情况下,输入文档必须是格式良好的XML文档,输出文档也是格式良好的XML文档。不过,有一个特殊的XSLT指令可以修改这种行为:
- `<xsl:output method="xml"/>`是默认的输出方法,输出文档是格式良好的文档,样式表中包含的标签必须遵守XML格式良好的规则,例如没有闭合标签`</br>`的HTML标签`<br>`是不允许的,而相应的XHTML标签`<br/>`是允许的。
- `<xsl:output method="html"/>`允许在样式表中指定HTML 4.0标签,即使它们违反了样式表的格式良好性。可以指定空元素的标签(如`<br>`或`<p>`)而无需闭合标签。这种输出方法还能保持脚本中的字符串完整,支持最小化属性(无值的属性),不区分HTML标签的大小写等。但输入文档必须始终是格式良好的XML。
- `<xsl:output method="text"/>`会从输出中去除所有标签,只显示输出树元素中包含的文本,这允许创建几乎任何文本输出格式,可以使用`media-type`属性设置输出文件的MIME类型。
##### 3.5 元转换
由于XSLT本身是一种基于XML的语言,任何XSLT样式表都可以被另一个XSLT样式表转换,这种技术可用于扩展XSLT语言。例如:
- **Schematron**:Schematron脚本用于检查XML实例是否符合某些约束条件。编写脚本后,使用Schematron编译器(实际上是一个预定义的XSLT样式表)将其编译成验证样式表,然后将生成的验证样式表应用于XML文档实例,转换结果是一个包含错误和警告列表的文档。
- **循环编译器**:由Oliver Becker实现([www.informatik.hu-berlin.de/~obecker/XSLT/#loop-compiler](www.informatik.hu-berlin.de/~obecker/XSLT/#loop-compiler)),这个XSLT预处理器将非XSLT语句(如`<loop:for from="expression" to="expression" step="expression"> ... </loop:for>`)转换为标准的XSLT表达式,预处理器本身也是作为一个XSLT样式表实现的。
更多XSLT的非常规使用示例可以在[“Gallery of Stupid XSL and X
0
0
复制全文
相关推荐









