2012-01-19 4 views
2

私は、XSLTを他のXSLTを含むさまざまなコンポーネントの「コードジェネレータ」として使用します。たとえば、テーブルのMSSQL sys.columns行のXML出力を生成するクエリがあり、各行の列を含むテーブルを含むXSLTを生成したいとします。XSLTを生成する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> 

を:

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

注代わり所望の。

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>命令ための主なユースケースである。この変換は、任意のXML文書に適用されると

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

(使用しない)、希望の結果(すべてたかった属性を持つ新しいスタイルシートと名前空間)が生成されます

<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を使用しないでくださいとwは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を使用している要素がない場合、名前空間宣言は必要ありません。