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

+0

ああ!そして私はあなたの本を持っています。 x2凡例ステータス。 – JavaRocky

+0

あまりにも親切な言葉をありがとう。 :-) –

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:tag構文を使用することができます。ただしかしタグでタグ、およびそれがない場合、それは実装に依存することがあります。

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns="somenamespace" 
    xmlns:mynamespace="somenamespace" 
    version="2.0"> 

私はMYNAMESPACEを交換することを完全にはよく分からない:

あなたも、これをやってみてください。

+0

いいえ、私はが必要です。デフォルトの名前空間は別のものです。このXSLは、XSLTパイプラインの一部です。 – JavaRocky