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引擎,因此多个工具表现出一致的异常行为。
解决方案
- 使用合规处理器测试:采用符合XSLT规范的处理器(如Saxon、旧版Libxslt)运行样式表,可得到预期结果。
- 显式指定优先级:通过
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
相关产品推荐
相关产品推荐

