在 XSLT 中注入名称空间

Inject namespace in XSLT

是否可以将名称空间注入 XSLT 文档,以便(例如)使用字符串的值来指定名称空间?我知道同样可以分别使用 <xsl:attribute/><xsl:element/> 结构来声明属性和元素(例如)。名称空间是否有类似的结构? 我提出这个要求的原因是我想构造一个 XSLT 转换来构造一个 XML 请求,该请求在许多接受相同 XML 结构(除了它们应用不同的名称空间)的供应商之间使用。 我使用 Saxon XSLT 处理器。

在 XSLT 2 和更高版本中有 xsl:namespace (https://www.w3.org/TR/xslt-30/#creating-namespace-nodes) 当然,我不确定它是否有助于处理来自不同名称空间的输入,例如 xsl:element ,它创建结果节点。 不要忘记 xsl:elementxsl:attribute 都允许您使用 namespace 属性在不同的命名空间中构造结果节点。

在任何命名空间中有 *:foo 到 select 或匹配 foo 元素。

使用 xsl:namespace.

在 XSLT 2.0 中轻松完成

如果您确实需要在 XSLT 1.0 中执行此操作(为什么?),则有一个曲折的解决方法:

<xsl:variable name="temp">
  <xsl:element name="{$prefix}:dummy" namespace="{$uri}"/>
</xsl:variable>
<xsl:copy-of select="exsl:node-set($temp//*/namespace::*)"/>