Saxon转换器配置:忽略docgen命名空间版本差异实现兼容
解决Saxon-HE中命名空间版本差异导致的转换异常问题
先说结论:Saxon-HE 没有现成的配置项能直接忽略命名空间的版本差异。毕竟XML和XSLT的命名空间机制本来就是用来严格区分不同版本的词汇表的,这是W3C规范的核心要求,Saxon作为合规处理器会严格遵守这一点。
不过你可以通过几种代码层面的方式绕过这个问题:
让XSLT同时匹配两个命名空间:修改你的
documentA4.xsl,让模板或路径表达式兼容*/documentGeneration/1/2和*/documentGeneration/1/3两个命名空间。比如先定义两个前缀,然后用匹配规则覆盖两者:<xsl:stylesheet xmlns:docgen-old="*/documentGeneration/1/2" xmlns:docgen-new="*/documentGeneration/1/3" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0"> <!-- 匹配两个命名空间下的所有元素,统一输出为新命名空间 --> <xsl:template match="docgen-old:* | docgen-new:*"> <xsl:element name="{local-name()}" namespace="*/documentGeneration/1/3"> <xsl:apply-templates select="@* | node()"/> </xsl:element> </xsl:template> <!-- 保留其他默认模板逻辑 --> <xsl:template match="@* | node()"> <xsl:copy> <xsl:apply-templates select="@* | node()"/> </xsl:copy> </xsl:template> </xsl:stylesheet>用通配匹配兼容所有同前缀的命名空间:如果命名空间只是版本号不同,前缀一致,可以用标准XSLT函数匹配命名空间的前缀部分,自动适配不同版本:
<xsl:template match="*[starts-with(namespace-uri(), '*/documentGeneration/')]"> <!-- 统一使用目标命名空间版本 --> <xsl:element name="{local-name()}" namespace="*/documentGeneration/1/3"> <xsl:apply-templates select="@* | node()"/> </xsl:element> </xsl:template>预处理XML对齐命名空间:先写个简单的XSLT脚本把
docGen.xml里的*/documentGeneration/1/3替换成*/documentGeneration/1/2,或者反过来,等两者命名空间一致后再执行原转换。
最后提醒一句:命名空间版本差异一般意味着XML结构可能有不兼容的变化,强制忽略的话可能埋下逻辑隐患——除非你能确定两个版本的词汇表结构完全一致。
内容的提问来源于stack exchange,提问作者Thong Nguyen
相关产品推荐
相关产品推荐

