1

次のような XML フラグメントを発行する必要がある XSLT スタイルシートがあります (簡潔にするために「...」ビットは省略されています)。

<MyOuterType xmlns:xsi="..." xsi:type="foo:MyInnerType" xmlns:foo="..."/>

スタイルシートは次のようになります。

<xsl:stylesheet xmlns:foo="..." xmlns:xsi="...">
  ...
  <xsl:template match="...">
    <xsl:element name="MyOuterType">
      <xsl:attribute name="xsi:type">foo:MyInnerType</xsl:attribute>
    </xsl:element>
  </xsl:template>
</xsl:stylesheet>

XSLT プロセッサの出力は次のようになります。

<MyOuterType xmlns:xsi="..." xsi:type="foo:MyInnerType"/>

つまり、xmlns:foo宣言がありません。実際、宣言はスタイルシートで宣言されているにもかかわらず、出力された XML にはまったく含まれていません。これは、出力された XML を逆シリアル化する必要があるときに、後で混乱します。

xmlns:foo発行された XML に表示されるようにするにはどうすればよいですか? プロセッサは XSLT 1.0 を実装しています。

4

1 に答える 1

0

静的に生成する名前空間を知っているかどうか、または入力ドキュメントの情報に基づいているかどうかによって異なります。

静的にわかっている場合は、xsl:element の代わりにリテラルの結果要素を使用してください。

<MyOuterType xsi:type="foo:MyInnerType" xmlns:foo="....."/>

動的な決定の場合は、もう少し複雑です。XSLT 2.0 には、xsl:attribute が属性を生成するのとほぼ同じ方法で名前空間を生成する xsl:namespace 命令があります。XSLT 1.0 では、必要な名前空間を含む要素を作成し、xsl:copy を使用して名前空間ノードをコピーするのがコツです。

<xsl:variable name="dummy">
  <xsl:element name="foo:dummy" namespace="{$param}"/>
</xsl:variable>
<MyOuterType xsi:type="foo:MyInnerType">
  <xsl:copy-of select="exsl:node-set($dummy)/*/namespace::foo"/>
</MyOuterType>

残念ながら、名前空間ノードを正しく実装していない XSLT-1.0 プロセッサが 1 つまたは 2 つあるため、注意が必要です。

于 2012-10-23T20:45:01.490 に答える