使用Saxon引擎转换XML时的标签匹配异常问题排查
问题原因及解决方案
最可能的原因是输入XML的命名空间未在XSLT样式表中正确处理,具体分析和解决方式如下:
核心问题:命名空间不匹配
RFC索引XML大概率新增或启用了默认命名空间(比如根元素带有xmlns="https://www.rfc-editor.org/rfc-index"这类属性)。在XSLT中,直接使用rfc-entry这种无前缀的名称,只会匹配没有命名空间的元素;而name()='rfc-entry'能生效,是因为name()函数返回的是元素的本地名称(不带命名空间前缀或URI),会忽略命名空间的存在。解决方法
有两种简单的修正方式:设置默认XPath命名空间
在样式表的<xsl:stylesheet>根元素中添加xpath-default-namespace属性,指定输入XML的命名空间URI。例如:<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xpath-default-namespace="https://www.rfc-editor.org/rfc-index" version="2.0">这样所有无前缀的XPath表达式(如
//rfc-entry)和模板匹配规则(如<xsl:template match="rfc-entry"/>)都会自动关联到该命名空间,无需修改其他代码。声明命名空间前缀并使用前缀匹配
在样式表中声明命名空间前缀,然后在所有引用元素的地方添加前缀:<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:rfc="https://www.rfc-editor.org/rfc-index" version="2.0">之后将XPath表达式改为
//rfc:rfc-entry,模板匹配改为<xsl:template match="rfc:rfc-entry"/>即可。
验证方式
修改后重新执行样式表,count(//rfc-entry)(或带前缀的版本)应返回正确的元素数量,对应的模板也会被正常触发。
内容的提问来源于stack exchange,提问作者Alejandro Masino
相关产品推荐
相关产品推荐

