質問
名前空間のない要素を含むXMLドキュメントがあり、XSLTを使用して名前空間を追加したい。ほとんどの要素は名前空間Aにあります。いくつかはネームスペースBにあります。これを行うにはどうすればよいですか。
解決
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>
あなたが探しているのはそれですか?
他のヒント
このレシピには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>
個人的なメッセージ:こんにちは、Jeni Tennison。これを読んでいることを知っています。
これまでの所持品は次のとおりです。
<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はそれをカットするようには見えません)。
所属していません StackOverflow