2009-05-19 110 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

相關問題