名前空間のない要素を含む XML ドキュメントがあり、XSLT を使用してそれらに名前空間を追加したいと考えています。ほとんどの要素は名前空間 A にあります。いくつかは名前空間 B にあります。これを行うにはどうすればよいですか?
27423 次
3 に答える
14
foo.xml を使用
<foo x="1">
<bar y="2">
<baz z="3"/>
</bar>
<a-special-element n="8"/>
</foo>
および foo.xsl
<xsl:template match="*">
<xsl:element name="{local-name()}" namespace="A" >
<xsl:copy-of select="attribute::*"/>
<xsl:apply-templates />
</xsl:element>
</xsl:template>
<xsl:template match="a-special-element">
<B:a-special-element xmlns:B="B">
<xsl:apply-templates match="children()"/>
</B:a-special-element>
</xsl:template>
</xsl:transform>
私は得る
<foo xmlns="A" x="1">
<bar y="2">
<baz z="3"/>
</bar>
<B:a-special-element xmlns:B="B"/>
</foo>
それはあなたが探しているものですか?
于 2008-09-27T23:46:14.660 に答える
3
このレシピには2つの主要な材料が必要です。
ソースストックはアイデンティティ変換namespace
になり、メインフレーバーは属性によって与えられますxsl:element
。
次のテストされていないコードは、すべての要素にhttp://example.com/名前空間を追加する必要があります。
<xsl:template match="*">
<xsl:element name="xmpl:{local-name()}" namespace="http://example.com/">
<xsl:apply-templates select="@*|node()"/>
</xsl:element>
</xsl:template>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
個人的なメッセージ:こんにちは、ジェニ・テニソン。私はあなたがこれを読んでいることを知っています。
于 2008-09-27T23:38:13.260 に答える
1
これが私がこれまでに持っているものです:
<xsl:template match="*">
<xsl:element name="{local-name()}" namespace="A" >
<xsl:apply-templates />
</xsl:element>
</xsl:template>
<xsl:template match="a-special-element">
<B:a-special-element xmlns:B="B">
<xsl:apply-templates />
</B:a-special-element>
</xsl:template>
これはほとんど機能します。問題は、属性をコピーしていないことです。これまで読んだことから、 xsl:element には、要素からすべての属性をそのままコピーする方法がありません (use-attribute-sets はそれをカットしていないようです)。
于 2008-09-27T23:22:44.810 に答える