抱歉,您的浏览器无法访问本站
本页面需要浏览器支持(启用)JavaScript
了解详情 >

摘要:本文学习了如何使用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文档为例:

school.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
<?xml version="1.0" encoding="UTF-8"?>
<school address="北京市海淀区">
<name>阳光小学</name>
<teachers>
<teacher id="teacher_1">
<name>李明</name>
<subject>语文</subject>
</teacher>
<teacher id="teacher_2">
<name>赵强</name>
<subject>数学</subject>
</teacher>
</teachers>
<students>
<student id="student_1">
<name>张婷</name>
<gender></gender>
<age>13</age>
<hobbies>
<hobby>画画</hobby>
<hobby>弹琴</hobby>
</hobbies>
</student>
<student id="student_2">
<name>王浩</name>
<gender></gender>
<age>14</age>
<hobbies>
<hobby>跑步</hobby>
<hobby>游泳</hobby>
</hobbies>
</student>
</students>
</school>

测试网站:
https://magictool.ai/tool/xslt-transformation/zh/

5 语法

5.1 基本文档

基本样式表示例:

xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<!-- 输出格式定义 -->
<xsl:output method="html" encoding="UTF-8"/>

<!-- 根模板 -->
<xsl:template match="/">
<html>
<head>
<title>师生名单</title>
</head>
<body>
<h2>教师列表</h2>
<xsl:apply-templates select="school/teachers/teacher"/>
<h2>学生列表</h2>
<xsl:apply-templates select="school/students/student"/>
</body>
</html>
</xsl:template>

<!-- 教师模板 -->
<xsl:template match="teacher">
<div class="teacher">
<h3><xsl:value-of select="name"/></h3>
<p>科目: <xsl:value-of select="subject"/></p>
</div>
</xsl:template>

<!-- 学生模板 -->
<xsl:template match="student">
<div class="student">
<h3><xsl:value-of select="name"/></h3>
<p>性别: <xsl:value-of select="gender"/></p>
<p>年龄: <xsl:value-of select="age"/></p>
</div>
</xsl:template>

</xsl:stylesheet>

5.2 结构解析

5.2.1 声明

使用stylesheet元素或transform元素均可以声明文档为样式表:

xml
1
2
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:transform version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

声明需要使用命名空间,并且需要指定版本。

5.2.2 输出

使用output元素控制输出文档的特性:

xml
1
<xsl:output method="输出格式" encoding="编码"/>

属性:

  • method:指定输出格式,支持html和xml等格式。
  • encoding:指定输出文档中的编码。

5.2.3 模板

5.2.3.1 定义模板

使用template元素定义输出的模板:

xml
1
2
3
<xsl:template match="XPath表达式" mode="模板模式" name="模板名称">
<!-- 模板内容 -->
</xsl:template>

属性:

  • match:使用XPath表达式匹配节点。
  • mode:指定模板的模式。与apply-templates元素的mode属性配合使用。
  • name:指定模板的名称。与call-template元素的name属性配合使用。

支持匹配XML文档节点,也支持匹配应用模板选择的节点。

5.2.3.2 应用模板

使用apply-templates元素选择节点,定义模板如果能匹配这些节点,就会使用模板处理这些节点:

xml
1
<xsl:apply-templates select="XPath表达式" mode="模板模式"/>

属性:

  • select:使用XPath表达式匹配节点,基于template元素的match属性。
  • mode:设置应用模板的模式,如果匹配的节点有多种模板,通过此属性区分不同的模板。与template元素的mode属性配合使用。

只能在template元素内使用apply-templates元素。

5.2.3.3 调用模板

使用call-template元素直接调用模板,主要用于复用模板:

xml
1
<xsl:call-template name="模板名称"/>

属性:

  • name:设置调用模板的名称。与template元素的name属性配合使用。

只能在template元素内使用call-template元素。

5.3 核心元素

5.3.1 取值

使用value-of元素获取选定节点的值:

xml
1
<xsl:value-of select="XPath表达式"/>

属性:

  • select:使用XPath表达式匹配节点,基于template元素的match属性。

5.3.2 判断

5.3.2.1 if

使用if元素进行条件判断:

xml
1
2
3
<xsl:if test="判断条件">
<!-- 模板内容 -->
</xsl:if>

属性:

  • test:判断条件。
5.3.2.2 choose

使用choose元素进行条件判断,需要结合when元素和otherwise元素配合使用:

xml
1
2
3
4
5
6
7
8
<xsl:choose>
<xsl:when test="判断条件">
<!-- 模板内容 -->
</xsl:when>
<xsl:otherwise>
<!-- 模板内容 -->
</xsl:otherwise>
</xsl:choose>

属性:

  • test:判断条件。

choose元素内部可以有多个when元素,但只能有一个otherwise元素。

5.3.3 循环

使用for-each元素循环处理节点:

xml
1
2
3
<xsl:for-each select="XPath表达式">
<!-- 模板内容 -->
</xsl:for-each>

属性:

  • select:使用XPath表达式匹配节点,基于template元素的match属性。

5.3.4 排序

使用sort元素处理节点排序:

xml
1
<xsl:sort select="XPath表达式"/>

属性:

  • select:指定要排序的节点,根据节点的值进行排序。

只能在for-each元素内使用sort元素。

5.3.5 变量

使用variable元素在样式表中声明全局或局部变量并为其赋予值:

xml
1
2
<xsl:variable name="变量名称" select="XPath表达式或变量值"/>
<xsl:variable name="变量名称">变量值</xsl:variable>

属性:

  • name:定义变量名称。
  • select:使用XPath表达式计算变量值,也可以直接使用基本类型的值。

使用value-of元素获取定义的变量值:

xml
1
<xsl:value-of select="$变量名称"/>

5.3.6 参数

使用param元素在样式表中声明全局或局部变量并为其赋予值:

xml
1
<xsl:param name="参数名称" select="XPath表达式或参数值"/>

属性:

  • name:定义参数名称。
  • select:使用XPath表达式计算参数值,也可以直接使用基本类型的值,作为没有传参的默认值。

call-template元素调用模板时使用with-param元素获取定义的参数值:

xml
1
2
3
<xsl:call-template name="模板名称">
<xsl:with-param name="参数名称" select="XPath表达式或参数值"/>
</xsl:call-template>

如果with-param元素没有select属性,则使用param元素的select属性定义的默认值。

评论