XSLT根标记命名空间而不是元素属性命名空间

时间:2009-05-19 22:02:23

标签: xslt xml-namespaces

我有一个XSL文件来传输另一个XSL文件。我希望命名空间声明在根标记上,而不是在每个元素上重复!!

这是我的样式表:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:mynamespace="somenamespace" version="2.0">
    <xsl:output method="xml" omit-xml-declaration="no" standalone="yes" indent="yes" />
    <xsl:template match="myMatchedNode">
        <mynamespace:tag>Some text i want inserted into the xsl</mynamespace:tag>
        <xsl:copy>
            <xsl:apply-templates select="@*|node()" /></xsl:copy>
    </xsl:template>
</xsl:stylesheet>

输出如下内容:

....

<mynamespace:tag xmlns:mynamespace="somenamespace">Some text i want inserted into the xsl</mynamespace:tag>

....

如何强制命名空间声明到结果的根标记?!

2 个答案:

答案 0 :(得分:8)

您需要将命名空间节点插入结果树的document元素。有几种方法可以执行此操作,具体取决于您使用的是XSLT 1.0还是2.0。以下是2.0解决方案。我假设您正在对输入文档进行修改后的身份转换(您的问题没有真正指定):

<xsl:stylesheet version="2.0"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

  <!-- special rule for the document element -->
  <xsl:template match="/*">
    <xsl:copy>
      <!-- Add a namespace node -->
      <xsl:namespace name="mynamespace" select="'somenamespace'"/>
      <xsl:apply-templates select="@* | node()"/>
    </xsl:copy>
  </xsl:template>

  <!-- the identity template -->
  <xsl:template match="@* | node()">
    <xsl:copy>
      <xsl:apply-templates select="@* | node()"/>
    </xsl:copy>
  </xsl:template>

  <!-- the rest of your rules -->

</xsl:stylesheet>

要完整地介绍控制输出文档中命名空间的所有不同技术,请查看我网站上“XSLT命名空间”文章的"Not enough namespaces"部分。

答案 1 :(得分:1)

也许我误解了这个问题,但我认为你应该这样做:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns="somenamespace"
    version="2.0">

<xsl:output method="xml" omit-xml-declaration="no" standalone="yes"  indent="yes"/>

<xsl:template match="myMatchedNode">
  <tag>Some text i want inserted into the xsl</mynamespace>

  <xsl:copy>
    <xsl:apply-templates select="@*|node()"/>
  </xsl:copy>
</xsl:template>

</xsl:stylesheet>

这应该允许您使用命名空间标记作为默认命名空间,输出文档也将它们作为默认命名空间。您的输入文档仍然可以使用令人讨厌的mynamespace:标记语法。

您也可以尝试这样做:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns="somenamespace"
    xmlns:mynamespace="somenamespace"
    version="2.0">

我不完全确定会用my tag替换mynamespace:tag,如果确实如此,它可能依赖于实现。