2009-05-19 179 views
7

我有一个XSL文件来传输另一个XSL文件。我希望命名空间声明位于根标记上,而不是在每个单元上重复使用它!XSLT根标签名称空间,而不是元素属性名称空间

这里是我的样式表:

<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> 

.... 

如何强制空间声明到结果的根标签?

回答

8

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

你是先生,是个传奇人物。疯狂的联系!谢谢! – JavaRocky 2009-05-20 01:53:43

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"> 

我不能完全肯定,它将取代了myNameSpace:只用标签虽然标签,如果确实如此,则可能是执行相关的。

+0

不,我需要作为默认命名空间是别的。这个XSL是XSLT管道的一部分。 – JavaRocky 2009-05-19 23:15:03

相关问题