在 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:element
和 xsl: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::*)"/>
是否可以将名称空间注入 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:element
和 xsl:attribute
都允许您使用 namespace
属性在不同的命名空间中构造结果节点。
在任何命名空间中有 *:foo
到 select 或匹配 foo
元素。
使用 xsl:namespace
.
如果您确实需要在 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::*)"/>