XSLT:apply-templates 深入详解
1. 引言XSLT 与模板驱动的转换模型XSLTExtensible Stylesheet Language Transformations是处理 XML 文档的经典语言它采用声明式的模板驱动模型。整个转换的核心就是“模板规则”template rules而将控制权交给这些规则的关键指令就是xsl:apply-templates。本文将围绕这一核心指令展开通过大量可运行的代码实例带你彻底掌握它的用法和最佳实践。2. xsl:apply-templates 的核心概念xsl:apply-templates 的作用是告诉 XSLT 处理器“去为当前节点的子节点或指定节点集寻找匹配的模板规则并应用它们”。它本身不直接产生输出而是推动模板规则的选择与执行是整个转换流程的“调度器”。它的常用属性有select指定要处理的节点集XPath 表达式。默认值为node()即当前节点所有子节点。mode限定只在具有相同 mode 的模板中进行匹配用于对同一节点进行多种不同处理。3. 基础示例最简单的“复制并转换”我们从一个简单的例子开始将一段 XML 数据转换为 HTML 列表。3.1 输入 XML?xml version1.0 encodingUTF-8? books book title深入理解 XSLT/title author张三/author /book book titleXML 实战指南/title author李四/author /book /books3.2 XSLT 样式表?xml version1.0 encodingUTF-8? xsl:stylesheet version1.0 xmlns:xslhttp://www.w3.org/1999/XSL/Transform !-- 根模板 -- xsl:template match/ html body h2图书列表/h2 ul xsl:apply-templates selectbooks/book / /ul /body /html /xsl:template !-- 处理每个 book 节点 -- xsl:template matchbook li xsl:value-of selecttitle / —— xsl:value-of selectauthor / /li /xsl:template /xsl:stylesheet关键点根模板中通过xsl:apply-templates selectbooks/book /选择所有book元素处理器随后找到matchbook的模板并进行处理。输出如下html body h2图书列表/h2 ul li深入理解 XSLT —— 张三/li liXML 实战指南 —— 李四/li /ul /body /html4. 利用 select 属性进行有选择的处理默认的selectnode()会处理所有子节点包括文本节点、注释等大多数时候我们需要通过 XPath 表达式精准选择节点。假设我们只输出书名中包含“XML”的图书xsl:apply-templates selectbooks/book[contains(title, XML)] /或者只处理前两本书xsl:apply-templates selectbooks/book[position() lt; 2] /select 表达式非常灵活可以结合所有 XPath 函数让你在应用模板前完成过滤、排序和计算。5. 使用 mode 实现同一节点的多种呈现有时候我们需要对同一份数据进行不同的转换例如生成 HTML 页面和纯文本摘要。这时可以为同一个节点定义多个模板用mode加以区分。xsl:stylesheet version1.0 xmlns:xslhttp://www.w3.org/1999/XSL/Transform xsl:template match/ html body h2摘要模式/h2 ul xsl:apply-templates selectbooks/book modebrief / /ul h2详细模式/h2 xsl:apply-templates selectbooks/book modefull / /body /html /xsl:template !-- 摘要模板 -- xsl:template matchbook modebrief lixsl:value-of selecttitle //li /xsl:template !-- 详细模板 -- xsl:template matchbook modefull div h3xsl:value-of selecttitle //h3 p作者xsl:value-of selectauthor //p /div /xsl:template /xsl:stylesheet通过modebrief和modefull我们在同一文档中实现了两种不同的展示风格互不干扰。6. 排序与 xsl:sort 结合使用xsl:apply-templates 内部可以包含一个或多个xsl:sort元素用于指定处理节点的顺序。排序在模板应用之前完成不会修改输出顺序之外的内容。按作者姓名字母顺序输出图书xsl:apply-templates selectbooks/book xsl:sort selectauthor / /xsl:apply-templates也可以进行多级排序比如先按作者再按书名xsl:apply-templates selectbooks/book xsl:sort selectauthor / xsl:sort selecttitle / /xsl:apply-templates还可以控制排序数据类型和顺序xsl:apply-templates selectbooks/book xsl:sort selectprice>xsl:template match/ ul xsl:apply-templates selectbooks/book xsl:sort selectauthor / xsl:with-param nameseq selectposition() / /xsl:apply-templates /ul /xsl:template xsl:template matchbook xsl:param nameseq / li xsl:value-of select$seq /. xsl:value-of selecttitle / /li /xsl:template注意selectposition()的值在排序之后计算因此可以真实反映排序后的位置。参数传递使得模板的复用性大大提高你可以用同一个matchbook模板输出不同的附加信息。8. 命名模板 vs. apply-templates何时用谁XSLT 中有两种调用模板的方式apply-templates和call-template。前者是“让处理器自动寻找匹配的模板”后者是“显式调用一个命名模板”。apply-templates基于节点内容类型、上下文自动匹配适合处理结构化数据更符合声明式编程风格。call-template像函数调用适合封装可复用的逻辑例如生成格式化字符串不依赖当前节点。一个简单的对比!-- 使用 apply-templates -- xsl:apply-templates selectmessage / xsl:template matchmessage pxsl:value-of select. //p /xsl:template !-- 使用 call-template -- xsl:call-template nameprint-message xsl:with-param namemsg selectmessage / /xsl:call-template xsl:template nameprint-message xsl:param namemsg / pxsl:value-of select$msg //p /xsl:template在面向文档的转换中apply-templates往往是更好的选择而在构建工具类函数时call-template更直观。9. 常见陷阱与调试技巧忘记默认选择子节点如果没有selectapply-templates会处理所有子节点包括空白文本节点可能导致意外的空白输出。模板优先级混淆如果有多个模板匹配同一节点XSLT 会按照内置优先级规则选择必要时可使用priority属性显式指定。在排序中使用position()在xsl:sort的select中使用position()是排序前的位置通常不是你要的建议在排序后的模板中通过参数获取位置。调试输出可以在模板中插入xsl:message或生成临时 HTML 注释来观察执行流程。10. 实战将 RSS 提要转换为 HTML 摘要页面最后我们看一个将 RSS 2.0 订阅源转换为可读 HTML 的完整例子综合运用了 apply-templates、select、sort 和参数传递。?xml version1.0 encodingUTF-8? xsl:stylesheet version1.0 xmlns:xslhttp://www.w3.org/1999/XSL/Transform xsl:template match/ html headtitleRSS Digest/title/head body h1xsl:value-of selectrss/channel/title //h1 xsl:apply-templates selectrss/channel/item xsl:sort selectpubDate orderdescending / xsl:with-param nameindex selectposition() / /xsl:apply-templates /body /html /xsl:template xsl:template matchitem xsl:param nameindex / div classentry h2xsl:value-of select$index /. xsl:value-of selecttitle //h2 pemxsl:value-of selectpubDate //em/p pxsl:value-of selectdescription disable-output-escapingyes //p pa href{link}阅读原文/a/p /div /xsl:template /xsl:stylesheet这个例子展示了 apply-templates 在真实场景中的强大威力只需少量声明式代码就能完成排序、编号和结构化输出。11. 总结xsl:apply-templates 是 XSLT 编程思想的核心体现将关注点转向“什么数据应该被处理”以及“用什么规则处理”而不是“如何一步步生成结果”。熟练掌握 select、mode、sort 和参数传递能让你编写出更清晰、更灵活、更易维护的样式表。希望本文的代码实例能帮助你在实际项目中用好这一指令。

相关新闻

DriverStoreExplorer:7步掌握Windows驱动存储的专业清理与优化方案

DriverStoreExplorer:7步掌握Windows驱动存储的专业清理与优化方案

DriverStoreExplorer:7步掌握Windows驱动存储的专业清理与优化方案 【免费下载链接】DriverStoreExplorer Driver Store Explorer 项目地址: https://gitcode.com/gh_mirrors/dr/DriverStoreExplorer Windows驱动存储是操作系统中一个经常被忽视但至关重要的…

2026/8/12 18:08:22 阅读更多 →
大模型入门实战:从基座模型选型到本地部署的完整指南

大模型入门实战:从基座模型选型到本地部署的完整指南

1. 项目概述:为什么从基座与部署开始学大模型? 如果你刚接触大模型,面对网上铺天盖地的“微调”、“Agent”、“RAG”这些高级概念,是不是感觉无从下手?我刚开始的时候也一样,恨不得马上做出一个能对话的智…

2026/8/12 18:08:22 阅读更多 →
终极Real-ESRGAN图像超分辨率实战指南:如何让模糊图片瞬间变高清

终极Real-ESRGAN图像超分辨率实战指南:如何让模糊图片瞬间变高清

终极Real-ESRGAN图像超分辨率实战指南:如何让模糊图片瞬间变高清 【免费下载链接】Real-ESRGAN Real-ESRGAN aims at developing Practical Algorithms for General Image/Video Restoration. 项目地址: https://gitcode.com/gh_mirrors/re/Real-ESRGAN 想要…

2026/8/12 18:07:21 阅读更多 →

最新新闻

AI自动化任务调度实战:构建夜间执行的智能工作流

AI自动化任务调度实战:构建夜间执行的智能工作流

1. 项目概述:当“下班”不再是工作的终点 “活儿干不完,带回家加班”是很多职场人的常态。但有没有一种可能,当你关上电脑的那一刻,工作并没有停止,而是由一位不知疲倦的“数字同事”在深夜继续推进?这正是…

2026/8/12 18:56:38 阅读更多 →
Java模块化实战:从module-info.java解析到项目迁移指南

Java模块化实战:从module-info.java解析到项目迁移指南

1. 从“JAR地狱”到模块化:为什么我们需要module-info.java 如果你是从Java 8甚至更早版本一路用过来的开发者,肯定对“JAR地狱”这个词不陌生。项目依赖了A.jar,A.jar又依赖了B.jar的1.0版本,而你的项目本身又直接依赖了B.jar的2…

2026/8/12 18:56:38 阅读更多 →
Python异步并发实现多AI大模型统一调用与结果融合策略

Python异步并发实现多AI大模型统一调用与结果融合策略

1. 项目概述:为什么我们需要同时调用多个大模型?在AI应用开发的日常工作中,我经常遇到一个场景:同一个需求,交给GPT-4、Claude 3和Gemini 1.5 Pro去处理,得到的回答风格、深度和侧重点往往截然不同。比如&a…

2026/8/12 18:56:38 阅读更多 →
Stable Diffusion与ComfyUI局域网访问设置指南:实现多设备协作AI绘画

Stable Diffusion与ComfyUI局域网访问设置指南:实现多设备协作AI绘画

1. 从单机到共享:为什么我们需要局域网访问如果你和我一样,是个喜欢折腾AI绘画的玩家,那么大概率已经熟悉了Stable Diffusion WebUI(简称SD-WebUI)和ComfyUI这两大神器。它们一个像功能齐全的“旗舰店”,一…

2026/8/12 18:56:38 阅读更多 →
乐道3.1.0发布:一站式本地AI应用管理与部署平台新特性详解

乐道3.1.0发布:一站式本地AI应用管理与部署平台新特性详解

这次我们来看乐道3.1.0版本更新了什么。乐道是一款面向本地AI应用部署和管理的工具,这次更新重点在于提升易用性、扩展功能集成以及优化资源管理。对于关心如何更高效地在本地运行Stable Diffusion、ComfyUI、Ollama等AI工具的用户来说,这次更新提供了不…

2026/8/12 18:56:38 阅读更多 →
C语言梦开始的地方2:数据类型

C语言梦开始的地方2:数据类型

文章目录C语言梦开始的地方2:数据类型数据类型sizeof数据类型取值范围变量的创建全局变量和局部变量C语言梦开始的地方2:数据类型 上一章节我们说到了C语言的发展史,C语言的组成部分,C语言的三大结构和C语言的关键字。 本章节我们…

2026/8/12 18:55:37 阅读更多 →

日新闻

Ubuntu 22.04安装与使用tree命令:高效管理Linux目录结构

Ubuntu 22.04安装与使用tree命令:高效管理Linux目录结构

1. 为什么需要一个“目录树”工具?在Linux世界里,尤其是Ubuntu这样的发行版,命令行是很多人的主战场。我们每天都要和文件、目录打交道。ls命令是查看目录内容的首选,它简洁、高效,能列出文件名、权限、大小等关键信息…

2026/8/12 9:33:34 阅读更多 →
博思AI智能体:意图识别、思考链与性能优化的工程实践

博思AI智能体:意图识别、思考链与性能优化的工程实践

在AI应用从“能用”走向“好用”的进程中,系统的响应速度、决策透明度与高并发稳定性是决定用户体验的关键。博思AI智能体近期完成了一次重要的专项优化,聚焦于意图识别、思考链展示与全链路压测三大核心领域,将系统从功能实现推向了工程卓越…

2026/8/12 9:33:34 阅读更多 →
子代理架构:AI智能体任务分解与协同执行的核心原理与实践

子代理架构:AI智能体任务分解与协同执行的核心原理与实践

1. 项目概述:为什么我们需要“子代理”?最近在折腾各种AI应用和自动化流程时,我越来越频繁地遇到一个瓶颈:单个AI智能体(Agent)的能力边界。无论是处理复杂的多步骤任务,还是需要同时调用多个专…

2026/8/12 9:33:34 阅读更多 →

周新闻

5分钟告别提取码焦虑:baidupankey如何智能破解百度网盘资源锁

5分钟告别提取码焦虑:baidupankey如何智能破解百度网盘资源锁

5分钟告别提取码焦虑:baidupankey如何智能破解百度网盘资源锁 【免费下载链接】baidupankey 在线查询网盘提取码(维护中 rm repo) 项目地址: https://gitcode.com/gh_mirrors/ba/baidupankey 你是否曾经在深夜寻找一份重要资料&#x…

2026/8/12 1:11:09 阅读更多 →
如何快速生成中国车牌图片:Python开源工具完整指南

如何快速生成中国车牌图片:Python开源工具完整指南

如何快速生成中国车牌图片:Python开源工具完整指南 【免费下载链接】chinese_license_plate_generator 中国车牌生成器 项目地址: https://gitcode.com/gh_mirrors/ch/chinese_license_plate_generator 中国车牌生成器是一个基于Python的开源项目&#xff0c…

2026/8/12 1:11:09 阅读更多 →
收藏!小白程序员轻松入门大模型,从Harness工程开始实践

收藏!小白程序员轻松入门大模型,从Harness工程开始实践

文章强调学习大模型不应只关注模型本身,而应重视模型外的系统搭建,即Harness。提出AgentModelHarness的实用公式,详细介绍Harness的四个层次:持久化层、执行层、控制层和观察与验证层。文章还探讨了上下文工程、工具设计、AGENTS.…

2026/8/12 1:11:08 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/11 17:09:45 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/12 1:11:10 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/11 17:09:45 阅读更多 →