• 締切済み

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を用いています。 どうか、よろしくお願いします。

  • XML
  • 回答数2
  • ありがとう数7

みんなの回答

  • jo-ji
  • ベストアンサー率72% (26/36)
回答No.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/
  • jo-ji
  • ベストアンサー率72% (26/36)
回答No.1

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

rokuroh
質問者

お礼

回答ありがとうございます。 ずいぶん遅くなりましたが、補足させていただきます。 例の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" であることを期待しています。 とりあえず、接頭辞を付ける事を義務付けるという 解決策で消極的ではありますが、回避策としています。 上記のような方法でなく、解決することもできるのでしょうか? あるいは、接頭辞という概念が存在すること自体がこの問題の解決策であるような気もしています。 どんなことでも、ご教示いただければ幸いです。

関連するQ&A

  • 親のパラメータの取得

    いつもお世話になっています。 XML, XSL等の勉強を始めました。 子供から親のパラメータを取得する方法がよく分かりません。 sample.xsl ---------------------- <?xml version="1.0" encoding="Shift_JIS"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:template match="parent"> hello?:<xsl:value-of select="@hello" /><br /> <xsl:apply-templates select="child" /> </xsl:template> <xsl:template match="child"> hello2?:<xsl:value-of select="@hello" /><br /> </xsl:template> </xsl:stylesheet> sample.xml ------------------------------ <?xml version="1.0" encoding="Shift_JIS" ?> <?xml-stylesheet type="text/xsl" href="xmlsample.xsl" ?> <parent hello="hello2"> <child /> </parent> こんな感じでやっています。 parentの中で、childのtemplateがapplyしてあります。 こうすると、<parent>の中で<child>が呼び出されるのですが、このchildの中でparentに指定してあるパラメータhelloの値が取得したいです。 できれば変数に代入するとかせずに(まだトライしていません)、直接childからparentのhelloパラメータの内容を取得したいと思っています。 このようなことはxml, xslで可能なのでしょうか。 またどうすれば出来るのかご存じの方が居たら、よろしくお願いします。

    • ベストアンサー
    • XML
  • xsl 内の実体参照を宣言する方法??

    xsl 内で xhtml を使用する際に、&nbsp; などの実体参照のエンティティ宣言をしたいのですが、方法がわかりません。パーサは libxslt(AxKit) です。 例えばこんな感じかな、と思うのですが・・。 <?xml version="1.0" encoding="EUC-JP" ?> <!DOCTYPE html [ <!ENTITY nbsp " "> ]> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="html" encoding="EUC-JP"/> <xsl:template match="/"> <xsl:apply-templates /> </xsl:template> <xsl:template match="root"> <html> <head> ......

    • ベストアンサー
    • XML
  • 何故か子の要素に xmlns=

    ある「AABBCC」のタグが記述されているXML文書が有ります。 その文書に対し下記のXSLで変換をすると <?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> <xsl:output method="xml" version="1.0" encoding="UTF-16" indent="yes" /> <xsl:template match="/"> <ABC xmlns="http://www.abcd.co.jp/Schema_1_1"> <xsl:apply-templates select="AABBCC" /> </ABC> </xsl:template> <xsl:template match="AABBCC"> <DEF> <xsl:attribute name="ID">1</xsl:attribute> </DEF> </xsl:template> </xsl:stylesheet> 下記のような出力を期待しているのですが、 <?xml version="1.0" ?> <ABC xmlns="http://www.abcd.co.jp/Schema_1_1"> <DEF ID="1" /> </ABC> 何故か以下のようにDEFの属性に「xmlns=""」が追加されてしまいます。 <?xml version="1.0" ?> <ABC xmlns="http://www.abcd.co.jp/Schema_1_1"> <DEF ID="1" xmlns="" /> </ABC> まだ、XML,XSL共に勉強を始めたばかりでよく分かってないのでどうしてこのようなことが起こるのか、また対処法を教えてください。 アホな質問かもしれませんが、よろしくお願いします。

    • 締切済み
    • XML
  • XSLで、XMLの空タグを制御したい。

    値がないXML文書に、 <exsample /> こう書かれてしまうものを、 <exsample></exsample> このように出力したいのですが、出来ずでした。 以下は、私のやり方です。 ■ XSL <?xml version="1.0" encoding="Shift_JIS"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xalan="http://xml.apache.org/xslt"> <xsl:output method="xml" encoding="Shift_JIS" indent="yes" xalan:indent-amount="4"/> <xsl:template match="/"> <xsl:copy-of select="."/> </xsl:template> </xsl:stylesheet> ■ XML <?xml version="1.0" encoding="Shift_JIS"?> <root> <section> <category> <exsample1>value</exsample1> <exsample /> </category> </section> </root> ご教授、よろしくお願いいたします。

    • ベストアンサー
    • XML
  • XMLの実体参照とXSLT

    次のようなXMLファイルをXSLTで処理したいのですが、&baseの部分がうまく表示できません。 どのようにしたら表示できるでしょうか? ■a.xml <?xml version="1.0" encoding="UTF-8"?> <?xml-stylesheet type="text/xsl" href="a.xsl"?> <!DOCTYPE test [ <!ELEMENT name (#PCDATA)> <!ENTITY base SYSTEM "base.xml"> ]> <test> <name>abc</name> &base; </test> ■base.xml <?xml version="1.0" encoding="UTF-8"?> <base>base</base> ■a.xsl <?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" encoding="UTF-8" /> <xsl:template match="/"> <xsl:apply-templates select="test" /> <xsl:apply-templates select="base" /> </xsl:template> <xsl:template match="test"> name:<xsl:value-of select="name" /> </xsl:template> <xsl:template match="base"> base:<xsl:value-of select="base" /> </xsl:template> </xsl:stylesheet> □結果 name:abc ※base.xmlの内容を表示できない

    • ベストアンサー
    • XML
  • PHPでXMLを表示させたときの外部エンティティの挙動に関して

    XML+XSLでHTMLを生成する上で、PHPを経由する場合と、しない場合で、 外部エンティティの挙動が異なっていて悩んでいます。 具体的には、  ・XML+XSL+外部エンティティ → 意図通りHTML生成  ・PHP+XML+XSL+外部エンティティ → 意図通りHTML生成されない(外部エンティティが生成されない) こういうものなのでしょうか? もし、こういう仕様であれば、なにか対応策はあるのでしょうか? ソースと生成されたHTMLは下記の通りです。 【Though.php】 <?php header( 'Content-Type: text/html; charset=UTF-8' ); $xml = new DomDocument(); $xml->load( 'MainData.xml' ); $xsl = new DomDocument(); $xsl->load('Main.xsl'); $processor = new xsltprocessor(); $processor->importStyleSheet($xsl); echo $processor->transformToXML($xml); ?> 【MainData.xml】 <?xml version="1.0" encoding="utf-8"?> <?xml-stylesheet type="text/xsl" href="Main.xsl" ?> <!DOCTYPE books [ <!ENTITY sub_data SYSTEM "SubData.xml"> ]> <root> <node1>TEST1</node1> <node2>&sub_data;</node2> </root> 【Main.xsl】 <?xml version = "1.0" ?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> <xsl:template match="/"> <html> <xsl:apply-templates /> </html> </xsl:template> <xsl:template match="@*|node()"> <xsl:copy> <xsl:apply-templates /> </xsl:copy> </xsl:template> </xsl:stylesheet> 【SubData.xml】 <?xml version="1.0" encoding="utf-8"?> <sub_data>Test2</sub_data> 【XML+XSL+外部エンティティで生成されるHTML(ブラウザで直接MainData.xmlを開いた場合)】 <html><?xml-stylesheet type="text/xsl" href="Main.xsl" ><root><node1>TEST1</node1><node2><sub_data>Test2</sub_data></node2></root></html> 【PHP+XML+XSL+外部エンティティで生成されるHTML(ブラウザでThrough.phpを開いた場合)】 <html> <?xml-stylesheet type="text/xsl" href="Main.xsl" ><root> <node1>TEST1</node1> <node2></node2>    //←node2の中がカラッポになっている。。。 </root> </html> ※生成されたHTMLは、IE8の開発者ツールで確認しています。 XMLやPHPは最近やり始めたのでトンチンカンなことを言ってるかもしれませんが、よろしくお願いします。

    • ベストアンサー
    • PHP
  • XSLTがブラウザで表示されません。

    勉強のために、下記のサンプルXMLファイル、XSLファイルを作成し、ブラウザで表示させようと思ったのですが、表示されません。 表示させる為になにか必要なソフト等をインストールしないといけないのでしょうか? ちなみにブラウザはIE5.5を使用しています。 もし、何か分かる方がいらっしゃいましたら、ご教授御願い致します。 ※sample.xml <?xml version="1.0" encoding="Shift_JIS"?> <?xml-stylesheet type="text/xsl" href="sample.xsl"?> <PAGE> <EMPLOYEES> <EMPLOYEE> <EMPNO>1</EMPNO> <ENAME>一郎</ENAME> <JOB>President</JOB> <HIREDATE>1990-04-01</HIREDATE> <SAL>10000</SAL> <DEPTNO>10</DEPTNO> </EMPLOYEE> <EMPLOYEE> <EMPNO>50</EMPNO> <ENAME>次郎</ENAME> <JOB>Director</JOB> <MGR>1</MGR> <HIREDATE>1991-04-01</HIREDATE> <SAL>6000</SAL> <DEPTNO>30</DEPTNO> </EMPLOYEE> </EMPLOYEES> </PAGE> ※sample.xsl <?xml version="1.0" encoding="Shift_JIS"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/ 1999/XSL/Transform" version="1.0"> <xsl:output method="html" encoding="Shift_JIS"/> <xsl:template match="/"> <xsl:apply-templates/> </xsl:template> <xsl:template match="PAGE"> <HTML> <BODY> <xsl:apply-templates/> </BODY> </HTML> </xsl:template> <xsl:template match="EMPLOYEES"> <xsl:apply-templates/> </xsl:template> <xsl:template match="EMPLOYEE"> <xsl:value-of select="ENAME"/><BR/> </xsl:template> </xsl:stylesheet>

    • ベストアンサー
    • XML
  • うまく表示されない・・・

    XML初心者のものです。 以下のXMLをXSLを使用してWebで公開しようと試みてます。が、うまく表示されません。 どこがおかしいのでしょうか? また設置ディレクトリ構成も教えてください。 以下サンプルを示します。 -XMLファイル-(sake1.xml) <?xml version="1.0" encoding="Shift_JIS" ?> <?xml-stylesheet href="sake1.xsl" type="text/xsl" ?> <酒><名前>スーパードライ</名前></酒> -XSLファイル-(sake1.xsl) <?xml version="1.0" encoding="Shift_JIS" ?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:template match="酒"> <html> <head> <title>酒データ1</title> </head> <body> <p align="center">とりあえず表示してみる。</p> <p><xsl:value-of select="酒" /></p> </body> </html> </xsl:template> </xsl:stylesheet>

    • 締切済み
    • XML
  • xslのdocument関数で読込んだ2つのxmlをxsl:sortしたい

    次のXSLで動作させています。 <?xml version="1.0" encoding="Shift_JIS"?> <xsl:stylesheet xml:space="default" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0" xmlns:rs="urn:schemas-microsoft-com:rowset" xmlns:z="#RowsetSchema"> <xsl:output method="text" /> <xsl:template match="/"> <xsl:for-each select="document('取り込むXMLファイル')//z:row"> <xsl:value-of select="@取り出したい属性の名前" /> </xsl:for-each> <xsl:for-each select="//z:row"> <xsl:value-of select="@取り出したい属性の名前" /> </xsl:for-each> </xsl:template> </xsl:stylesheet> ここまでは出来たのですが、xsl:sortでまとめてsortするにはどうすればいいのでしょうか?

    • ベストアンサー
    • XML
  • XSLTでの複数のXML検索結果を統合するには?

    初歩的な質問でごめんなさい。 XSLTを使って複数のXMLを検索した結果を、表示したいのですが、結果を1つのテーブルに統合するにはどうすればいいのでしょう。 次のスクリプトを基に作りたいのですが。 function search (keyword) { node = thexsl.XMLDocument.selectSingleNode("//xsl:for-each"); if(keyword) node.setAttribute("select", "//data[contains(word, '" + keyword + "')]"); else node.setAttribute("select", "//data"); str = thexml.XMLDocument.transformNode(thexsl.XMLDocument); view1.innerHTML = str; } 次のファイルを利用して検索したいです、 <xml id="thexml1" src="db1.xml"></xml> <xml id="thexml2" src="db2.xml"></xml> <xml id="thexml3" src="db3.xml"></xml> <xml id="thexsl" src="db.xsl"></xml> xmlファイルの内容 <?xml version="1.0" encoding="utf-8" ?> <dataroot xml:lang="ja"> <data>・・・</data>  ・・・ </dataroot> xslファイルの内容 <?xml version="1.0" encoding="utf-8" ?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> <xsl:template match="/"> <table> <tr>・・・</tr> <xsl:for-each select="//data"> <tr>・・・</tr> </xsl:for-each> </table> </xsl:template> </xsl:stylesheet> よろしくお願いします。

    • 締切済み
    • XML

専門家に質問してみよう