2

次の出力を生成する必要があります。

<x:Envelope xmlns:x='namespace1'>
<x:Root xmlns="namespace2">
<Header>
...
</Header>
</x:Root>
</x:Envelope>

xslt 1.0 を使用して x:Root 要素のデフォルトの名前空間を生成するのに問題があります。名前空間を持たないようにすることもできます (ただし、ネームスペース 2 は root の子に指定されます - 望ましくない動作)。

<x:Root xmlns:x="namespace2"> 

しかし、これはスキーマ検証に失敗します。何か案は ?

編集:あいまいな質問で申し訳ありません。回答に感謝します。ルートは名前空間 1 にあり、ヘッダーは名前空間 2 にある必要があります。ただし、namespace2 はヘッダーではなく、ルート レベルで宣言する必要があります。

よろしく、

4

2 に答える 2

0

それは、これがどれだけ静的に知られているかに依存します。すべてを静的に知っている場合、リテラルの結果要素

<x:Root xmlns="namespace2">..</x:Root>

あなたが望むものを正確に生成します。より一般的なケースでは、必要な名前空間ノードを含む要素を作成してから、名前空間ノードをコピーする必要があります。

<xsl:param name="ns">namespace2</xsl:param>

<xsl:variable name="temp">
  <xsl:element name="dummy" namespace="{$ns}"/>
</xsl:variable>

...

<xsl:element name="Root">
  <xsl:copy-of select="xx:node-set($temp)/namespace::*"/>
</xsl:element>

XSLT 2.0 では、xsl:namespace 命令を使用することで、すべてが非常に簡単になります。

于 2013-08-21T08:40:15.757 に答える