こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

締切り済みの質問

XSLTによるノードの抽出の際に親のnamespaceで子ノードのnamespaceが上書きされないようにするには?

下記のようなXMLに
<?xml version="1.0" encoding="EUC-JP"?>
<parent xmlns:xhtml="http://parent">
<child id="A1">
<taroh xmlns="http://child">
<age>10</age>
</taroh>
</child>
</parant>

下記のようなXSLTを適用した場合、

<?xml version="1.0" encoding="EUC-JP"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0" >
<xsl:output method="xml"/>
<xsl:template match="text()|@*">
</xsl:template>
<xsl:template match="node()[@id='A1']">
<xsl:copy-of select="./node()"/>
</xsl:template>
</xsl:stylesheet>


通常下記のような結果となりますが、
<?xml version="1.0" encoding="EUC-JP"?>
<taroh xmlns="http://parent">
<age>10</age>
</taroh>

namespaceを変更させずに、下記のような結果を
得るためにはどのようにすればよいでしょうか?
<?xml version="1.0" encoding="EUC-JP"?>
<taroh xmlns="http://child">
<age>10</age>
</taroh>

抽出には
javax.xml.transform.Transformerを用いています。

どうか、よろしくお願いします。

投稿日時 - 2003-02-26 18:57:22

QNo.484070

すぐに回答ほしいです

このQ&Aは役に立ちましたか?

6人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.2

#1で回答した者です。

こちらで試した限りでは、接頭辞のあるなしに関係なく、taroh要素は、元々属していたnamespaceに属している結果となりました。

<taroh xmlns="http://child">
<age>10</age>
</taroh>

XSLTの仕様からもこれが正しい動作だと思います。

XTやXalanの最新版を使うと結果はどうなりますか?

※ Javaのバージョンが1.4以上の場合、javaのオプションに以下のように指定しないと、標準で付属する方が使われてしまいます(参考URL)。
java -Djava.endorsed.dirs=d:\xml_tool\xalan-j_2_4_1\bin ...

参考URL:http://java.sun.com/j2se/1.4/ja/docs/ja/guide/standards/

投稿日時 - 2003-03-10 14:55:54

ANo.1

日数が経ってしまっているので解決済みかもしれませんが、誰も答えてないので、とりあえずアドバイスを。

コピーアンドペースト(</parant>は</parent>に修正)して試してみても、
<taroh xmlns="http://child" xmlns:html="http://parent">
<age>10</age>
</taroh>
のようになって、namespaceが置き換えられてしまうような結果は再現しません。
xmlns:html="http://parent"が余計に付いてますが、出力される要素が属するnamespaceはあくまで"http://child"の方です。それとも、この宣言を除きたいのでしょうか?
いずれにしても、補足していただく必要があると思います。

投稿日時 - 2003-03-03 14:02:00

お礼

回答ありがとうございます。
ずいぶん遅くなりましたが、補足させていただきます。

例のXMLが間違っていました。
実際は下記のように親のネームスペースに接頭辞が付かな状況を想定していました。
<?xml version="1.0" encoding="EUC-JP"?>
<parent xmlns="http://parent">
<child id="A1">
<taroh xmlns="http://child">
<age>10</age>
</taroh>
</child>
</parent>

そして、あくまで抽出されたXMLのネームスペースは
xmlns="http://child"
であることを期待しています。

とりあえず、接頭辞を付ける事を義務付けるという
解決策で消極的ではありますが、回避策としています。

上記のような方法でなく、解決することもできるのでしょうか?

あるいは、接頭辞という概念が存在すること自体がこの問題の解決策であるような気もしています。

どんなことでも、ご教示いただければ幸いです。

投稿日時 - 2003-03-07 21:38:33

あなたにオススメの質問