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

时间:2016-01-21 12:55:54

标签: xml xslt xpath xml-namespaces

我有来自不同系统的传入XML文件,并为当前版本的邮件声明了名称空间 示例:xmlns:abc =" MatchingVersion_6-0"
我使用一个小的XSLT表解决了这个问题。

其中一个喂食系统现在已经更新了它们的版本并且正在使用新版本的名称: 示例:xmlns:abc =" MatchingVersion_7-0"

有没有办法可以使用相同的样式表来处理BOTH类型 - 因为我仍然将两个版本的XML文件都接收到使用此样式表的同一界面。 xpaths都是相同的,前缀是相同的 - 但前缀解析为导致此问题的不同值。 我已经调查了这个,似乎可以使用[local-name] - 虽然我想知道是否有更好的方法来实现这一目标? 提前谢谢!

2 个答案:

答案 0 :(得分:1)

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

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

我最好的建议是为新的命名空间版本自动生成新的XSLT。您可以使用XSLT在XSLT上运行来执行此操作。

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

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

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

答案 1 :(得分:0)

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

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