在XSLT中创建元素时有没有办法添加带有命名空间的属性?

问题描述 投票:0回答:1

我正在尝试使用另一个 XSLT 文件创建一个 XSLT 文件,

<xsl:element name="xsl:stylesheet">
      <xsl:attribute name="version">1.0</xsl:attribute>
      <xsl:attribute name="xmlns:msxsl">urn:schemas-microsoft-com:xslt</xsl:attribute>
      <xsl:attribute name="xlink">http://www.w3.org/1999/xlink</xsl:attribute>
      <xsl:attribute name="exclude-result-prefixes">msxsl</xsl:attribute>

        <xsl:apply-templates select="Root"/>
    </xsl:element>

第二个属性有一个命名空间“xmlns”,它会抛出错误:前缀未定义。

没有第三个属性 xlink 中的命名空间,它也可以正常工作。

那么如何指定命名空间呢?

谢谢你

xslt namespaces element
1个回答
0
投票

您无法使用

xsl:attribute
创建名称空间节点,因为在 XSLT 数据模型中,名称空间和属性是不同的东西。

在结果树中创建命名空间节点有多种方法:

(a) 如果您从源树复制一个元素(例如使用

<xsl:copy-of/>
),那么它的命名空间也会被复制。

(b) 如果您在样式表中编写文字结果元素(例如

<thing xmlns:z="http://z/"/>
那么它的命名空间也会被复制,即使它们没有在任何元素或属性名称中使用。

(c) 如果使用

xsl:element
构造元素,则元素名称或其属性名称中使用的任何命名空间将通过称为命名空间修复的过程自动出现在结果树中。

(d) 从 XSLT 2.0 开始,有一个

xsl:namespace
指令供上述所有方法失败时使用。

您没有说明您正在使用哪个版本的 XSLT,这始终是一个错误,但由于您的代码提到了

msxsl
那么我猜它可能是旧版 XSLT 1.0。如果是这样的话,我认为你有两个选择:

(1) 将文字结果元素与 xsl:namespace-alias 一起使用 - 在规范和其他地方有很多这样的示例。

(2) 创建一个结果树片段,如下所示:

<xsl:variable name="dummy">
  <msxml:dummy xmlns:msxml="..."/>
</xsl:variable>

然后使用

<xsl:copy-of select="exslt:node-set($dummy)//namespace::*"/>

将其命名空间复制到最终结果树中
© www.soinside.com 2019 - 2024. All rights reserved.