模板匹配是XSLT转换的核心机制,由处理器自动派发而非手动调用;match属性为XPath表达式,决定模板生效节点,如book、/、@id、text()及带条件的book[@category='fiction']等;xsl:apply-templates触发匹配,控制权交还处理器以重新选模;多模板匹配时依静态优先级(谓词>元素名>通配符)或priority显式指定;默认模板对元素递归处理子节点、对文本原样输出,自定义模板会覆盖对应默认行为。

模板匹配是XSLT转换的核心机制,它不靠手动调用,而是由处理器自动“派发”——你声明“什么样的节点该怎么变”,XSLT引擎在遍历XML树时自动找匹配、选模板、执行输出。
match属性写什么:常见XPath模式
match值本质是XPath表达式,决定这个模板对哪些节点生效:
-
匹配元素名:
match="book"→ 所有元素,无论嵌套多深 -
匹配根节点:
match="/"→ 整个文档起点,常用于主结构包装(如) -
匹配属性:
match="@id"→ 所有id属性;需配合显式触发 -
匹配文本节点:
match="text()"→ 可精细控制空白、换行或纯内容提取 -
带条件的精确匹配:
match="book[@category='fiction']"→ 仅限category="fiction"的book,优先级高于普通match="book" -
用|匹配多个类型:
match="title|author"→ title和author都走同一套处理逻辑
模板怎么被触发:xsl:apply-templates 是关键
没有,模板只是“待命状态”。它的作用是把控制权交还给处理器,让其重新为当前节点(或select指定的节点)匹配模板:
-
→ 处理当前节点的所有子节点(元素、文本、注释等),没模板就走默认规则(如输出文本) -
→ 只处理当前上下文下的子元素 -
→ 先定位到每个book,再让book内部子节点各自匹配模板(更可控)
多个模板都能匹配时,谁说了算?
当一个节点满足多个match表达式,XSLT按**静态优先级**选最具体的那个:
- 默认优先级由模式明确性决定:带谓词的(如
book[@type])> 纯元素名(book)> 通配符(*) - 可显式用
priority="1"或priority="-0.5"覆盖默认值,数字越大越优先 - 用
可在当前模板执行后,继续调用下一个匹配模板(适合叠加处理,比如先转大写、再加标点)
别忘了默认模板的存在
即使你一个都没写,XSLT也有内置行为:
- 对元素节点:默认递归调用
处理所有子节点 - 对文本节点:默认原样输出(含空格和换行)
- 一旦你写了
match="book",就完全覆盖book的默认行为——它不再自动处理子节点,除非你在模板里显式写
基本上就这些。模板不是函数,不靠调用,而靠“声明+分发”;match写得准,apply-templates放得对,转换逻辑就自然流动起来了。










