2012-01-19 58 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,则命名空间声明不是必需的。