XSLT模板匹配(template match)怎么用 XSLT模板规则应用方法

17次阅读

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

XSLT模板匹配(template match)怎么用 XSLT模板规则应用方法

模板匹配是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放得对,转换逻辑就自然流动起来了。

text=ZqhQzanResources