摘要:本文学习了如何使用XSLT将XML文档转换为其他文档。
1 简介
XSLT(Extensible Stylesheet Language Transformations)是一种用于将XML文档转换为其他格式的语言,属于XSL(可扩展样式表语言)家族的一部分。
XSL是用于转换的样式表,通过XSL将XML文档转换为其他文档。
XSL家族:
- XSLT:负责转换内容
- XPath:负责选择节点
- XSL-FO:负责格式化对象,用于PDF生成
2 版本
2.1 XSLT 1.0
1999年发布,依赖XPath 1.0版本。
特点:
- 最早的稳定版本,应用最广泛,兼容性最强。
- 依赖
XPath 1.0版本,仅支持四种简单基本类型,不支持复杂数据结构。
2.2 XSLT 2.0
2007年发布,依赖XPath 2.0版本。
特点:
- 在1.0基础上大幅增强,面向更复杂的转换场景。
- 依赖
XPath 2.0版本,支持更多的数据类型和函数操作。
2.3 XSLT 3.0
2017年发布,依赖XPath 3.1版本。
特点:
- 进一步强化功能性和工程化能力,适应现代数据处理需求。
- 依赖
XPath 3.1版本,支持高阶函数和匿名函数,支持流式处理。
3 核心
核心功能:
- XML到XML转换:转换XML结构
- XML到HTML转换:生成网页内容
- XML到文本转换:生成纯文本
- 数据提取和重组:提取特定数据
4 案例
以一个简单的XML文档为例:
1 |
|
测试网站:
https://magictool.ai/tool/xslt-transformation/zh/
5 语法
5.1 基本文档
基本样式表示例:
1 |
|
5.2 结构解析
5.2.1 声明
使用stylesheet元素或transform元素均可以声明文档为样式表:
1 | <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> |
声明需要使用命名空间,并且需要指定版本。
5.2.2 输出
使用output元素控制输出文档的特性:
1 | <xsl:output method="输出格式" encoding="编码"/> |
属性:
- method:指定输出格式,支持html和xml等格式。
- encoding:指定输出文档中的编码。
5.2.3 模板
5.2.3.1 定义模板
使用template元素定义输出的模板:
1 | <xsl:template match="XPath表达式" mode="模板模式" name="模板名称"> |
属性:
- match:使用XPath表达式匹配节点。
- mode:指定模板的模式。与
apply-templates元素的mode属性配合使用。 - name:指定模板的名称。与
call-template元素的name属性配合使用。
支持匹配XML文档节点,也支持匹配应用模板选择的节点。
5.2.3.2 应用模板
使用apply-templates元素选择节点,定义模板如果能匹配这些节点,就会使用模板处理这些节点:
1 | <xsl:apply-templates select="XPath表达式" mode="模板模式"/> |
属性:
- select:使用XPath表达式匹配节点,基于
template元素的match属性。 - mode:设置应用模板的模式,如果匹配的节点有多种模板,通过此属性区分不同的模板。与
template元素的mode属性配合使用。
只能在template元素内使用apply-templates元素。
5.2.3.3 调用模板
使用call-template元素直接调用模板,主要用于复用模板:
1 | <xsl:call-template name="模板名称"/> |
属性:
- name:设置调用模板的名称。与
template元素的name属性配合使用。
只能在template元素内使用call-template元素。
5.3 核心元素
5.3.1 取值
使用value-of元素获取选定节点的值:
1 | <xsl:value-of select="XPath表达式"/> |
属性:
- select:使用XPath表达式匹配节点,基于
template元素的match属性。
5.3.2 判断
5.3.2.1 if
使用if元素进行条件判断:
1 | <xsl:if test="判断条件"> |
属性:
- test:判断条件。
5.3.2.2 choose
使用choose元素进行条件判断,需要结合when元素和otherwise元素配合使用:
1 | <xsl:choose> |
属性:
- test:判断条件。
在choose元素内部可以有多个when元素,但只能有一个otherwise元素。
5.3.3 循环
使用for-each元素循环处理节点:
1 | <xsl:for-each select="XPath表达式"> |
属性:
- select:使用XPath表达式匹配节点,基于
template元素的match属性。
5.3.4 排序
使用sort元素处理节点排序:
1 | <xsl:sort select="XPath表达式"/> |
属性:
- select:指定要排序的节点,根据节点的值进行排序。
只能在for-each元素内使用sort元素。
5.3.5 变量
使用variable元素在样式表中声明全局或局部变量并为其赋予值:
1 | <xsl:variable name="变量名称" select="XPath表达式或变量值"/> |
属性:
- name:定义变量名称。
- select:使用XPath表达式计算变量值,也可以直接使用基本类型的值。
使用value-of元素获取定义的变量值:
1 | <xsl:value-of select="$变量名称"/> |
5.3.6 参数
使用param元素在样式表中声明全局或局部变量并为其赋予值:
1 | <xsl:param name="参数名称" select="XPath表达式或参数值"/> |
属性:
- name:定义参数名称。
- select:使用XPath表达式计算参数值,也可以直接使用基本类型的值,作为没有传参的默认值。
在call-template元素调用模板时使用with-param元素获取定义的参数值:
1 | <xsl:call-template name="模板名称"> |
如果with-param元素没有select属性,则使用param元素的select属性定义的默认值。
条