You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

XSLT样式表模板顺序影响匹配结果的异常问题咨询

XSLT模板顺序异常匹配问题分析

问题场景

XML输入

<?xml version="1.0" encoding="UTF-8"?>
<root>
 <a>
  <b>
   <c>1</c>
   <c>2</c>
   <c>3</c>
  </b>
 </a>
 <a>
  <b>
   <c>4</c>
   <c>5</c>
   <c>6</c>
  </b>
 </a>
</root>

异常XSLT代码(输出6次lower priority)

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:template match="/">
<xsl:apply-templates select="*"/>
</xsl:template>

<xsl:template match="b/c">higher priority</xsl:template>
<xsl:template match="b/*">lower priority</xsl:template>

</xsl:stylesheet>

正常XSLT代码(输出6次higher priority)

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:template match="/">
<xsl:apply-templates select="*"/>
</xsl:template>

<xsl:template match="b/*">lower priority</xsl:template>
<xsl:template match="b/c">higher priority</xsl:template>

</xsl:stylesheet>

矛盾点

按照XSLT 1.0规范的模板优先级规则:

  • 元素名称匹配模式(如b/c)的优先级高于通配符匹配模式(如b/*),因此无论模板定义顺序如何,b/c模板都应优先匹配,输出higher priority。但新版Chrome的在线测试工具中,模板顺序会直接影响匹配结果,与规范不符。

根因

这是新版Chrome内置XSLT处理器的实现bug。旧版Chrome采用的XSLT引擎(如Libxslt)正确遵循优先级规则,而新版切换的引擎在优先级计算逻辑上出现错误,错误地将后定义的模板视为更高优先级,忽略了模式本身的优先级权重。

由于在线测试工具依赖浏览器原生XSLT引擎,因此多个工具表现出一致的异常行为。

解决方案

  1. 使用合规处理器测试:采用符合XSLT规范的处理器(如Saxon、旧版Libxslt)运行样式表,可得到预期结果。
  2. 显式指定优先级:通过priority属性强制设置模板优先级,确保匹配逻辑不受顺序影响:
<xsl:template match="b/c" priority="1">higher priority</xsl:template>
<xsl:template match="b/*" priority="0">lower priority</xsl:template>

内容的提问来源于stack exchange,提问作者Mario

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 06:27:53