- PR -

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

1
投稿者投稿内容
VBEE
会議室デビュー日: 2005/12/05
投稿数: 6
投稿日時: 2005-12-08 12:42
どなたか知っていたら教えてください。

環境はWinXP+JRun4+JDK1.4です。

XML->XMLをXSL変換で行う際の名前空間の指定をroot以下全てに指定するXSLを作成し変換されたXMLは指定された名前空間で出力される結果となったのですが。
同じプログラムをWinXP+Tomcat+JDK1.5へ移行すると、変換後のXMLに指定してないプレフィックスがついてしまいます。
JDKのバージョン違いによる様な気もするのですが、事例を探しても見つからない状況なので質問させていただきました。
宜しくお願いします。

以下XSLと変換前XML、変換後XML(JDK1.4)、変換後XML(JDK1.5)です。

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" namespace="http://www.test">
<xsl:element name="state" namespace="http://www.test">
<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(JDK1.4)[aft.xml] 期待した結果
<?xml version="1.0" encoding="UTF-8"?>
<docset xmlns="http://www.test"><doc><state>on</state></doc><doc><state>off</state></doc></docset>

変換後XML(JDK1.5)[aft.xml] 不測の結果
<?xml version="1.0" encoding="UTF-8"?>
<ns2:docset xmlns:ns2="http://www.test"><ns0:doc xmlns:sn0="http://www.test"><ns1:state xmlns:sn1="http://www.test">on</ns1:state></ns0:doc><ns0:doc xmlns:sn0="http://www.test"><ns1:state xmlns:sn1="http://www.test">off</ns1:state></ns0:doc></ns:2docset>

MMX
ぬし
会議室デビュー日: 2001/10/26
投稿数: 861
投稿日時: 2005-12-08 21:18
デフォルト名前空間の時の 空プリフィックスの場合の比較がうまく行かず
それぞれに、プリフィックスが付くのですね、
xmlのinfosetでは同等なのだから名前空間を処理する系では問題ないでしょう。
では ダメか。

<?xml version="1.0" encoding="UTF-8"?>
<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="a:doc" namespace="http://www.test">
<xsl:element name="a:state" namespace="http://www.test">
<xsl:value-of disable-output-escaping="no" select="STATE"/>
</xsl:element>
</xsl:element>
</xsl:template>
<!--
本文はここから
-->
<xsl:template match="/">
<xsl:element name="a:docset" namespace="http://www.test">
<xsl:apply-templates select="TOPDATA/DOCDATA"/>
</xsl:element>
</xsl:template>
</xsl:stylesheet>

では、a に対してはどうでしょう?
ー==========================================
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns="http://www.test">
<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">
<xsl:apply-templates select="TOPDATA/DOCDATA"/>
</xsl:element>
</xsl:template>
</xsl:stylesheet>

でも、デフォルト名前空間は 付けられます。

============================================================
XQuery でも 出力の名前空間の付け方はいろいろらしいです。
http://www.datypic.com/services/xquery/IntroductionToXQuery.pdf
の p157 前後の
Eliminating Namespace Declarations in Results
など。


[ メッセージ編集済み 編集者: MMX 編集日時 2005-12-22 23:54 ]
VBEE
会議室デビュー日: 2005/12/05
投稿数: 6
投稿日時: 2005-12-09 19:32
MMXさま
ありがとうございました。

ご指摘のとおりデフォルト名前空間に空プリフィックスを指定する事でできました。
まだまだ色々と勉強する事がありますが、とりあえず解決できました。
本当にありがとうございました。
1

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