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

Jav*_*cky 7 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>
Run Code Online (Sandbox Code Playgroud)

它输出这样的东西:

....

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

....
Run Code Online (Sandbox Code Playgroud)

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

Eva*_*enz 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>
Run Code Online (Sandbox Code Playgroud)

有关控制输出文档中命名空间的所有不同技术的完整内容,请查看我网站上"XSLT中的命名空间"一文中的" 不够命名空间"部分.