7

我有一个 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>

....

我如何将命名空间声明强制到结果的根标签上?!

4

2 回答 2

9

您需要将命名空间节点插入到结果树的文档元素中。有几种方法可以做到这一点,具体取决于您使用的是 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 中的名称空间”一文的“没有足够的名称空间”部分。

于 2009-05-20T00:47:47.010 回答
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:tag 语法。

您也可以尝试这样做:

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

我不完全确定是否会用 tag 替换 mynamespace:tag ,如果是这样,它可能取决于实现。

于 2009-05-19T22:58:16.703 回答