用于处理具有不同 URL 的名称空间前缀的 XSLT

XSLT to handle namespace prefixes with different URLs

我有来自不同系统的传入 XML 个文件,这些文件具有为消息的当前版本声明的名称空间。
示例:xmlns:abc="MatchingVersion_6-0"
我使用小型 XSLT sheet.

毫无问题地解析了它

其中一个馈送系统现已更新其版本并正在使用新版本名称空间进行馈送:
示例:xmlns:abc="MatchingVersion_7-0"

有没有一种方法可以用相同的样式处理两种类型sheet - 因为我仍然收到两个版本的 XML 文件到使用这种样式的同一接口sheet. xpath 完全相同,前缀相同 - 但前缀解析为导致此问题的不同值。 我已经对此进行了调查,似乎可以通过使用 [local-name] - 尽管我想知道是否有更好的方法来实现这一目标? 提前致谢!

没有什么好办法。如果您更改名称空间前缀定义,而不更改文档中的任何其他内容,就好像您已经开始使用一组全新的元素(对于原始名称空间中的那些元素)。

XML-toolchain 中的任何内容(包括 XSLT)都无法为您提供一种将一个名称空间中的元素与另一个名称空间中的元素相关联的好方法。有一些低效的解决方案,例如命名空间的通配符和 local-name(),但是这些解决方案绕过了 XSLT 试图做的所有事情,以使事情 运行 顺利进行,并使您的代码变得丑陋。

我的最佳建议是 auto-generate 为新的命名空间版本创建一个新的 XSLT。您可以使用 XSLT 对 XSLT 进行操作来执行此操作。

当然,如果问题范围有限,可能会有更简单的解决方案;你可以像这样使用析取:

<xslt:template match="a1:foo|a2:foo"> ... </xslt:template>

假设 a1 和 a2 绑定到两个不同的命名空间。

XSLT/XPath 2.0 及更高版本允许您使用例如<xsl:template match="*:foo"> 分别使用命名空间前缀通配符的路径步骤,这样您就可以编写 XSLT 来满足任何命名空间,只需使用本地名称进行匹配分别选择。

在 XSLT 3.0 中,您可以使用影子属性来参数化 xpath-default-namespace,请参阅 section in the spec on that