news 2026/9/6 9:28:11

XSLT 编辑 XML:从入门到实战的完整指南

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
XSLT 编辑 XML:从入门到实战的完整指南

1. 引言

XSLT(Extensible Stylesheet Language Transformations)是一种用于将 XML 文档转换为其他格式(如 HTML、纯文本或其他 XML 结构)的声明式语言。它不仅是数据展示的利器,更是 XML 数据编辑、清洗和重构的核心工具。本文将通过丰富的代码实例,系统讲解如何使用 XSLT 对 XML 文档进行各种编辑操作。

2. XSLT 基础概念

在深入编辑技巧之前,先了解 XSLT 的几个核心概念:

  • XSLT 处理器:负责读取 XML 源文档和 XSLT 样式表,并生成输出结果的引擎,常见的有 Saxon、libxml2 等。
  • 模板规则:通过<xsl:template>定义,匹配 XML 树中的特定节点并指定输出内容。
  • XPath 表达式:用于在 XML 文档中定位节点,是 XSLT 模板匹配和值提取的基础。
  • 样式表:一个符合 XSLT 规范的 XML 文档,以<xsl:stylesheet><xsl:transform>为根元素。

3. 环境准备与第一个示例

本文所有示例均基于 XSLT 1.0 和 2.0 标准,可使用任意主流 XSLT 处理器运行。下面是一个最简单的转换示例,将 XML 转换为 HTML 列表。

源 XML 文件(books.xml):

<?xml version="1.0" encoding="UTF-8"?> <catalog> <book id="b1"> <title>XML 入门</title> <author>张三</author> <price>59.00</price> </book> <book id="b2"> <title>XSLT 实战</title> <author>李四</author> <price>79.00</price> </book> </catalog>

对应的 XSLT 样式表(books.xsl):

<?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:template match="/"> <html> <body> <h1>图书列表</h1> <ul> <xsl:for-each select="catalog/book"> <li> <xsl:value-of select="title"/> (作者:<xsl:value-of select="author"/>) </li> </xsl:for-each> </ul> </body> </html> </xsl:template> </xsl:stylesheet>

使用命令行工具(如 Saxon)执行转换:

java -jar saxon9he.jar -s:books.xml -xsl:books.xsl -o:books.html

输出结果(books.html):

<html> <body> <h1>图书列表</h1> <ul> <li>XML 入门(作者:张三)</li> <li>XSLT 实战(作者:李四)</li> </ul> </body> </html>

4. 使用模板匹配编辑 XML

模板匹配是 XSLT 最强大的编辑机制。通过定义多个模板规则,可以精确控制每个节点的处理方式,实现增删改查等编辑操作。

4.1 修改元素内容

下面的示例将所有图书价格上调 10%,并保留两位小数:

<?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <!-- 默认复制所有节点和属性 --> <xsl:template match="@*|node()"> <xsl:copy> <xsl:apply-templates select="@*|node()"/> </xsl:copy> </xsl:template> <!-- 修改价格元素 --> <xsl:template match="price"> <price> <xsl:value-of select="format-number(. * 1.1, '0.00')"/> </price> </xsl:template> </xsl:stylesheet>

转换后,<price>59.00</price>变为<price>64.90</price><price>79.00</price>变为<price>86.90</price>

4.2 删除特定节点

以下样式表删除所有价格超过 70 元的图书节点:

<?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:template match="@*|node()"> <xsl:copy> <xsl:apply-templates select="@*|node()"/> </xsl:copy> </xsl:template> <!-- 删除价格大于 70 的图书 --> <xsl:template match="book[price > 70]"/> </xsl:stylesheet>

注意:空模板规则表示匹配到的节点不产生任何输出,从而实现删除效果。

4.3 新增元素与属性

下面的示例为每本图书添加一个category属性和一个discount子元素:

<?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:template match="@*|node()"> <xsl:copy> <xsl:apply-templates select="@*|node()"/> </xsl:copy> </xsl:template> <xsl:template match="book"> <book> <xsl:copy-of select="@*"/> <xsl:attribute name="category">技术</xsl:attribute> <xsl:apply-templates/> <discount>0.85</discount> </book> </xsl:template> </xsl:stylesheet>

5. 使用 XPath 精确定位与编辑

XPath 是 XSLT 的查询语言,掌握常用 XPath 表达式可以大幅提升编辑效率。以下是一些常用场景。

5.1 按条件筛选节点

只输出价格在 50 到 80 之间的图书:

<xsl:template match="/"> <result> <xsl:apply-templates select="catalog/book[price >= 50 and price <= 80]"/> </result> </xsl:template>

5.2 使用位置索引

选取第一本和最后一本图书:

<xsl:template match="/"> <result> <xsl:copy-of select="catalog/book[1]"/> <xsl:copy-of select="catalog/book[last()]"/> </result> </xsl:template>

5.3 使用通配符与轴

选取所有子元素和所有属性:

<xsl:template match="/"> <result> <xsl:copy-of select="catalog/book/*"/> <xsl:copy-of select="catalog/book/@*"/> </result> </xsl:template>

6. 高级编辑技巧

6.1 使用变量与参数

通过<xsl:variable><xsl:param>实现可复用的编辑逻辑。下面的示例使用参数控制是否包含折扣信息:

<?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:param name="showDiscount" select="'false'"/> <xsl:template match="@*|node()"> <xsl:copy> <xsl:apply-templates select="@*|node()"/> </xsl:copy> </xsl:template> <xsl:template match="book"> <book> <xsl:copy-of select="@*"/> <xsl:apply-templates/> <xsl:if test="$showDiscount = 'true'"> <discount>0.85</discount> </xsl:if> </book> </xsl:template> </xsl:stylesheet>

运行时传入参数:

java -jar saxon9he.jar -s:books.xml -xsl:books.xsl -o:books_out.xml showDiscount=true

6.2 使用排序与分组

按价格降序排列图书,并按作者分组输出:

<?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:template match="/"> <result> <xsl:for-each select="catalog/book"> <xsl:sort select="price"><?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:template name="formatPrice"> <xsl:param name="value"/> <xsl:value-of select="format-number($value, '¥#,##0.00')"/> </xsl:template> <xsl:template match="price"> <price> <xsl:call-template name="formatPrice"> <xsl:with-param name="value" select="."/> </xsl:call-template> </price> </xsl:template> </xsl:stylesheet>

7. 处理命名空间

处理带命名空间的 XML 时,需要在样式表中声明相同的命名空间。以下示例处理 SOAP 风格的 XML:

<?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ord="http://example.com/orders"> <xsl:template match="/"> <result> <xsl:apply-templates select="//ord:order"/> </result> </xsl:template> <xsl:template match="ord:order"> <order id="{@id}"> <xsl:value-of select="ord:total"/> </order> </xsl:template> </xsl:stylesheet>

8. 常见问题与调试技巧

  • 输出空白过多:在样式表根元素上添加<xsl:strip-space elements="*"/>可去除源文档中的空白节点。
  • 模板不生效:检查 XPath 表达式是否匹配目标节点,注意命名空间前缀是否正确声明。
  • 属性值模板:在属性值中使用{表达式}语法可以动态生成属性值,如<book id="{@id}">
  • 调试输出:使用<xsl:message>在处理器控制台输出调试信息。
<xsl:template match="book"> <xsl:message>正在处理图书:<xsl:value-of select="title"/></xsl:message> <!-- 其他处理逻辑 --> </xsl:template>

9. 总结

XSLT 提供了一套完整、声明式的 XML 编辑方案。通过模板匹配、XPath 定位、变量参数和命名模板等机制,开发者可以高效地完成 XML 数据的增删改查、格式转换和结构重组。虽然 XSLT 的学习曲线相对陡峭,但一旦掌握其核心思想,处理复杂 XML 编辑任务将变得游刃有余。建议读者结合本文示例,在实际项目中逐步实践,以加深理解。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/6 9:27:50

【希望将来有一天,大家不再看我的博客】

很久没有分享技术文档了&#xff0c;因为最近遇到问题&#xff0c;都会找AIagent&#xff0c;我也很少再从网络上看其他人的博客&#xff0c;这应该就是未来的趋势。不清楚关注我的大部分从事什么行业的&#xff0c;希望将来有一天&#xff0c;大家不再看我的博客&#xff0c;学…

作者头像 李华
网站建设 2026/9/6 9:27:25

机器人数据工程:从全球悬赏看高质量数据集如何构建

看到 Figure 全球悬赏人类“干活”这条消息&#xff0c;我的第一反应不是“机器人公司怎么开始做人力外包了”&#xff0c;而是&#xff1a;机器人行业的数据竞争&#xff0c;已经进入需要专门建一条人类数据生产线的阶段。如果只看表面&#xff0c;这像是一则招聘新闻&#xf…

作者头像 李华
网站建设 2026/9/6 9:27:14

LLM推理速度优化实战:从TTFT到TPS的调优指南

最近在 Hacker News 上看到一个名字很直接的 Show HN 项目&#xff1a;Frontier.fast&#xff0c;副标题是 “Help push the frontier of LLM speed forward”。做本地 LLM 部署的人看到这句话应该都有同感&#xff1a;同一个模型&#xff0c;在别人机器上跑到 50 token/s&…

作者头像 李华
网站建设 2026/8/31 17:29:50

数学建模竞赛一等奖论文深度解析:从模型构建到论文写作的实战指南

简介&#xff1a;本资源为2021年第十八届中国研究生数学建模竞赛&#xff08;华为杯&#xff09;E题全国一等奖获奖作品完整交付包&#xff0c;面向数学建模初学者、参赛研究生及高校指导教师&#xff0c;聚焦复杂噪声环境下多源传感器数据建模与标签识别这一典型工程问题。压缩…

作者头像 李华
网站建设 2026/8/31 2:16:19

AI Agent开发入门:零基础5天掌握Function Calling与工程化实践

AI Agent 这个词&#xff0c;在 2026 年已经进入了工程化落地阶段。不管是电商智能客服、日志巡检、数据分析助手&#xff0c;还是企业内部知识库问答&#xff0c;背后都是同一套模式&#xff1a;大模型负责理解任务&#xff0c;工具接口负责执行动作&#xff0c;中间再叠加一层…

作者头像 李华
网站建设 2026/9/2 7:24:52

【单片机课设毕设项目】基于 STM32 的便携式心率血氧体温检测仪设计 基于 STM32 单片机的体征采集与无线监控系统实现(013205)

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于嵌入式单片机&#xff0c;Java、小程序技术领域和毕业项目实战 ✌️…

作者头像 李华