- PR -

XSL変換したXMLの名前空間について

1
投稿者投稿内容
VBEE
会議室デビュー日: 2005/12/05
投稿数: 6
投稿日時: 2005-12-06 12:54
初めまして。
私は今、XML->XML変換のXSLを作成しています。
XSLで新しいエレメントを作成してその名前空間を指定してるのですが、そのエレメントの直下のエレメントで名前空間が取り消されてしまうのです。
なぜなのでしょうか?
また、なにか解決法はありませんでしょうか?
宜しくお願いします。

以下XSLと変換元XML、変換後XMLです。

XSLファイル[date.xsl]
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8"/>
<xsl:strip-space elements="*"/>

<!-- 1件分のデータ -->
<xsl:template match="TOPDATA/DOCDATA">
<xsl:element name="doc">
<xsl:element name="state">
<xsl:value-of disable-output-escaping="no" select="STATE"/>
</xsl:element>
</xsl:element>
</xsl:template>

<!--
本文はここから
-->
<xsl:template match="/">
<xsl:element name="docset" namespace="http://www.test">
<xsl:apply-templates select="TOPDATA/DOCDATA"/>
</xsl:element>
</xsl:template>

</xsl:stylesheet>

変換元XML[test.xml]
<?xml version="1.0" encoding="UTF-8"?>
<TOPDATA><DOCDATA><STATE>on</STATE></DOCDATA><DOCDATA><STATE>off</STATE></DOCDATA></TOPDATA>

変換後XML[aft.xml]
<?xml version="1.0" encoding="UTF-8"?>
<docset xmlns="http://www.test"><doc xmlns=""><state>on</state></doc><doc xmlns=""><state>off</state></doc></docset>
スフレ
ぬし
会議室デビュー日: 2005/05/27
投稿数: 281
お住まい・勤務地: 東京
投稿日時: 2005-12-06 13:02
すべての xsl:element に namespace 属性を指定する必要があります。namespace 属性は、名前空間宣言の位置を示しているのではなくて、作成する要素の名前空間を示しているので。

もしくは、xsl:stylesheet 要素に xmlns:out="http://www.test/" を追加して、全xsl:element 要素で name="out:doc" のようにプレフィックス付きにしてください。
VBEE
会議室デビュー日: 2005/12/05
投稿数: 6
投稿日時: 2005-12-06 14:36
ありがとうございます。
教えて頂いた方法で確認できました。

また質問になるのですが。
結果のXMLでroot要素以外の子要素でxmlns="…"がつかないのは同じ名前空間を使用するため、引き継いでいるという事なのでしょうか?
XSLでは全ての要素にnamespaceを指定したので、XMLでいうnamespaceとXSLで設定するnamespaceの扱いがこんがらがってしまっています。
1

スキルアップ/キャリアアップ(JOB@IT)