2012-01-19 60 views
2

我使用XSLT作爲各種組件的「代碼生成器」,包括其他XSLT。例如,我有一個查詢爲表生成MSSQL sys.columns行的XML輸出,並且希望生成一個XSLT,其中包含一個包含每行的列的表。Xslt生成Xslt:設置根名稱空間

所以我想產生以下XSLT:

<xsl:stylesheet version="1.0" xmlns:format="urn:qbo3-formatting" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    ... 
</xsl:stylesheet> 

我產生上面這樣的 '發電機' XSLT的XSLT:

<xsl:element name="xsl:stylesheet"> 
    <xsl:attribute name="version">1.0</xsl:attribute> 
    <xsl:attribute name="format" namespace="http://www.w3.org/XML/1998/namespace" >urn:qbo3-formatting</xsl:attribute> 
    ... 
</xsl:element> 

的問題是,這個 '發電機' XSLT產生:

<xsl:stylesheet version="1.0" xml:format="urn:qbo3-formatting" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    ... 
</xsl:stylesheet> 

注意xml:format而不是所需的xmlns:format

根據W3C的說法,'xmlns'被保留並綁定到'http://www.w3.org/2000/xmlns/'。如果我試圖創建上面使用這個命名空間的格式屬性,我得到一個錯誤:

Elements and attributes cannot belong to the reserved namespace 'http://www.w3.org/2000/xmlns/'.

任何建議上一個變通?

由於提前,

埃裏克

回答

1

這也正是爲<xsl:namespace-alias>指令主要用例:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:format="some:format" 
xmlns:xxx="xxx"> 
<xsl:output omit-xml-declaration="yes" indent="yes"/> 

<xsl:namespace-alias stylesheet-prefix="xxx" 
         result-prefix="xsl"/> 

<xsl:template match="/"> 
    <xxx:stylesheet version="1.0" 
     xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
     xmlns:format="some:format" 
    > 

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

</xsl:template> 
</xsl:stylesheet> 

當這種轉變是在任何XML文檔(未使用),想要的結果應用(與所有新的樣式表想要的屬性和命名空間)產生:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
       xmlns:format="some:format"> 
    <xsl:template match="node()|@*"> 
    <xsl:copy> 
     <xsl:apply-templates select="node()|@*" /> 
    </xsl:copy> 
    </xsl:template> 
</xsl:stylesheet> 

請注意:避免使用xsl:element,喜歡xsl:namespace-alias瓦特每當轉換應該生成另一個XSLT樣式表。

+1

正是我所需要的;非常感謝! –

+0

@EricPatrick:不客氣。 –

0

試試這個:

<xsl:element name="xsl:stylesheet"> 
    <xsl:attribute name="version">1.0</xsl:attribute> 
    <xsl:namespace name="format" select="'urn:qbo3-formatting'"/> 
</xsl:element> 

或者,而不是明確地輸出一個XML命名空間,允許XSLT來自動生成的XML命名空間,一旦該命名空間的節點習慣了。如果沒有元素正在使用urn:qbo3-formatting,則命名空間聲明不是必需的。