XSLでXMLの親要素を取得する方法

このQ&Aのポイント
  • XSLで、<item>要素が<a>要素の下にあるのか<b>要素の下にあるのかを知る方法はありますか?
  • <item>要素が複数箇所にわかれているため、local-name(..)の方法では難しいです。
  • XMLの親要素を取得するためのXSLの方法についてご教示いただきたいです。
回答を見る
  • ベストアンサー

XSLで親の取得方法

次のようなXMLで、<item>の位置より<a>配下なのか<b>配下なのかを 知る方法はないでしょうか? local-name(..)とかで、名前を調べようかと思いましたが、 実際は、もっと深く潜っているということと、複数箇所にわかれるて いることから、local_name(..)の方法は、ちょっと無理だと思っています。 -XML-------------------- <data> <a><item>アイテムA</item></a> <b><item>アイテムB</item></b> </data> ------------------------ ご指導ください。よろしくお願いします。

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

質問者が選んだベストアンサー

  • ベストアンサー
回答No.2

あ、すんません。 >xsl:output method="html" になっているけどうそです >xsl:output method="xml" で

その他の回答 (1)

回答No.1

自信なし。回答というよりアドバイスか。 Q3241862-1.xml <?xml version="1.0" encoding="UTF-8"?> <data> <a><item>アイテムA</item></a> <b><item>アイテムB</item></b> <b><d><e><item><f>アイテムC</f></item></e></d></b> <a><b><item>アイテムD</item></b></a> </data> Q3241862-1.xsl <?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0" xmlns:himajin="himajin"> <xsl:output method="html" encoding="UTF-8"/> <xsl:template match="/"> <himajin:hoge> <xsl:apply-templates /> </himajin:hoge> </xsl:template> <xsl:template match="data/a//item"> <himajin:item type="a"><xsl:value-of select="." /></himajin:item> </xsl:template> <xsl:template match="data/b//item"> <himajin:item type="b"><xsl:value-of select="." /></himajin:item> </xsl:template> </xsl:stylesheet> Q3241862-1R.xml <himajin:hoge xmlns:himajin="himajin"> <himajin:item type="a">アイテムA</himajin:item> <himajin:item type="b">アイテムB</himajin:item> <himajin:item type="b">アイテムC</himajin:item> <himajin:item type="a">アイテムD</himajin:item> </himajin:hoge> Q3241862-2.xsl <?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0" xmlns:himajin="himajin"> <xsl:output method="html" encoding="UTF-8"/> <xsl:template match="/"> <himajin:hoge> <xsl:apply-templates /> </himajin:hoge> </xsl:template> <!-- 複数の条件にマッチするときは確か下の方に書かれているものが優先されていたと思う。 以下の上下を入れ替えるとQ3241862-2Rの結果が変わる --> <xsl:template match="data//a//item"> <himajin:item type="a"><xsl:value-of select="." /></himajin:item> </xsl:template> <xsl:template match="data//b//item"> <himajin:item type="b"><xsl:value-of select="." /></himajin:item> </xsl:template> </xsl:stylesheet> Q3241862-2R.xml <himajin:hoge xmlns:himajin="himajin"> <himajin:item type="a">アイテムA</himajin:item> <himajin:item type="b">アイテムB</himajin:item> <himajin:item type="b">アイテムC</himajin:item> <himajin:item type="b">アイテムD</himajin:item> <!--下位優先なので。typeがbになっている--> </himajin:hoge> Q3241862-3.xsl <?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0" xmlns:himajin="himajin"> <xsl:output method="html" encoding="UTF-8"/> <xsl:template match="/"> <himajin:hoge> <xsl:apply-templates /> </himajin:hoge> </xsl:template> <xsl:template match="item"> <xsl:element name="himajin:item"> <xsl:attribute name="type"> <!-- local-nameにノードリストを指定したときは,指定されたものの中の 最初のノードに対する結果が返る。 とりあえず手元で, (ancestor::b | ancestor::a)を指定しても結果は変わらなかった。俺はよくわからんけど。 --> <xsl:value-of select="local-name( ancestor::a | ancestor::b)" /> </xsl:attribute> <xsl:value-of select="." /> </xsl:element> </xsl:template> </xsl:stylesheet> Q3241862-3R.xml <himajin:hoge xmlns:himajin="himajin"> <himajin:item type="a">アイテムA</himajin:item> <himajin:item type="b">アイテムB</himajin:item> <himajin:item type="b">アイテムC</himajin:item> <himajin:item type="a">アイテムD</himajin:item> </himajin:hoge>

関連するQ&A

  • XSL : 変数について

    XSL : 変数について 初めて質問致します。 ご教示宜しくお願い致します。 ****** XML文書 ****** <root> <A>1</A> <B> <B_1>2</B_1> <B_2>3</B_2> </B> </root> ****** 質問 ****** xsl で、上記xml文書の<B>タグ配下 <B_1>2</B_1> <B_2>3</B_2> を変数に代入するにはどのようにすれば いいでしょうか?(タグ名も含めて) 下記の2つを試してみましたが、 いずれも 「2 3」となります。 ・ <xsl:variable name="hoo" select="B"/> ・<xsl:variable name="hoo"> <xsl:copy-of select="B"> </xsl:variable> 質問に不明瞭な点がありましたら ご指摘下さい。 宜しくお願い致します。

    • 締切済み
    • XML
  • XMLから指定テキストのみを抜き出すXSLについて

    次のようなXMLからhide属性ない箇所のテキストのみを抜き出したいのですが、 どうすればよいでしょうか? [xml] <data> ××××<a hide="hide">○○○○○○○○○○○○</a>・<a>◎◎◎◎◎<b hide="hide">●●●</b>▲▲▲▲</a>△△△△ </data> [求める結果] ××××・◎◎◎◎◎▲▲▲▲△△△△

    • ベストアンサー
    • XML
  • XSL(異なるノードからエレメントを取得)

    XSLを書き始めたばかりでつまずいています。 下記のようなXMLファイルがあるとして… === <Menulist> <Menu No="1" Item="3" Time="100"/> <Menu No="2" Item="1" Time="60"/> <Menu No="3" Item="1" Time="120"/> <Menu No="4" Item="2" Time="10"/> </Menulist> <Setlist> <Set No="1"> <Set_name Name="Push Up" /> <Set No="2"> <Set_name Name="Run" /> <Set No="3"> <Set_name Name="Swim" /> </Setlist> ========= ここで、XSLを用いてMenulistのMenuのItemが1の時には、SetlistのSet Noが1の"PushUP"を取り出して、Menu Noとともに、Menuの数だけ表示したいのです。 こうしたあるノードのエレメントの値を使って、別のノードのエレメントの値を取得する方法をご教示ください。

    • ベストアンサー
    • XML
  • jQueryでxmlの異なるタグ要素を取得したい。

    jQueryを最近勉強したての者です。 詳しい方、どうか教えて下さい。 HTMLにxmlのデータを読み込ませようとしています。 概略をお話しすると、 htmlファイルによって、xmlの別々の要素を取得したいのです。 やりたいメソッドは同じです。 別々の要素の中のデータによって、imgの表示/非表示を切り替えたいのです。 問題は、対象となるhtmlファイルが複数あり そのhtmlファイルによって、参照するxmlのタグが異なる事なんです。 xmlは、以下のように<shopdata>をルートノードとし、以下のような感じです。 --------------------- <?xml version="1.0" encoding="utf-8"?> <shopdata> <item> <name1>0</name1> <name2>1</name2> <name3>0</name3> </item> </shopdata> --------------------- <name*>~</name*> の中のデータは、0もしくは1なのですが 0の時はimgを表示 1の時はimgを非表示させようと考えています。 ただ<name1><name2><name3> とタグ名がバラバラなんです。 ※おしりの数字が違うだけで、規則的ではあります。 ちなみにhtmlは複数あって  a.htmlの時は→xmlの<name1>を参照  b.htmlの時は→xmlの<name2>を参照  c.htmlの時は→xmlの<name3>を参照 という感じです。 ※htmlファイル名は特に規則的ではなく、いろいろなファイル名がついています。。。 最初、考えたのは、 htmlのどこかに、id="1"と入れて、idが1の時は、<name1>の要素を取得し、 htmlのどこかに、id="2"と入れて、idが2の時は、<name2>の要素を取得し… っていうことを考えたのですが、それもどのように書いたら良いのかが分からないんです。 そもそも、そういった事は可能なのでしょうか? ちなみのhtmlのbodyタグ自体がテンプレートでできているので、 idをどこかにふるとしたら、head内とかになるのしょうか? それぞれ、ボタンの表示は、 if文を使って、show(),hide()メソッドを使うとは思うのですが… 詳しくコードを教えていただけたら、助かります。 どうか、宜しくお願いいたします。

    • ベストアンサー
    • AJAX
  • perl XMLの入れ子取得方法

    下記のようなツリー状のXMLから、親となっている情報と子の情報を分けて取得したいのですが、testプログラムで、子だけは取れましたが親の情報だけ取り出す方法が分かりません。どなたか取得方法、サンプルなどを教えていただけないでしょうか? --------------------------------------- <?xml version="1.0" encoding="UTF-8"?> <rss version="2.0" xmlns:review="http://www.test.com/"> <channel> <title>test</title> <language>ja</language> <item> <number>1</number> <title>親レビュータイトル</title> <item>  <number>3</number>  <title>子レビュー2タイトル</title> </item> <item>  <number>2</number>  <title>子レビュー1タイトル</title> </item> </item> </channel> </rss> ---------------------------------------    #testプログラム #!/usr/local/bin/perl use XML::LibXML; #$rss は上記のXMLの内容 $parser = XML::LibXML->new; $doc = $parser->parse_string($rss); @nodes = $doc->findnodes ( "//*[local-name()='item']/*[local-name()='item']" ); for $node (@nodes){ $item ->{'number'} = Henkan::henkan( "-Wexm0",$node->findvalue("./number/text()")); $item ->{'title'} = Henkan::henkan( "-Wexm0",$node->findvalue("./title/text()")); print "[$item ->{'number'}]\n"; print "[$item ->{'title'}]\n"; } ---------------------------------------

  • VB2005でXMLから複数ある要素の項目を取得する方法

    VB2005、XMLの初心者です。 下記XMLの「ヤマダタロウ」を抽出するのがうまくいきません。 <Module> <Body> <Item Code= A TableId=001> <Name>ヤマダタロウ</Name> </Item> <Item Code= B TableId=001> <Name>山田太郎</Name> </Item> </Body> </Module> 上記XMLがmsxmlDocとして引数で下記プロシージャに渡されるのですが、selectNodesではなぜか取得できません。 どこか間違っているでしょうか。 Private Sub prvParseXML(Byval msxmlDoc As MSXML2.DOMDocument) Dim NodeList As MSXML2.IXMLDOMNodeList NodeList = msxmlDoc.selectNodes("/Module/Body/Item[@Code='A'][@tableId='001']/Name") End Sub 何かヒントになるようなことでも良いので、皆様の知恵をお借りできれば幸いです。 よろしくお願い致します。

  • xsl内の変数計算方法とパラメータ取得方法

    xsl+xml+cssを使い、1ページに一定数の画像を表示させ、 ページングさせるxslを作っています。 わからないことは (1)変数の計算方法について  ページの先頭表示データを以下のように定義しました。  <xsl:variable name="TopData" select="1" /> nextボタン押し下げ時に1ページ先の先頭表示データを以下のように計算したいのですが、  <xsl:variable name="TopData" select="$TopData=$TopData+$PageData" />  画面にfalseと表示されてしまいました。  また、backボタン押し下げ時に1ページ前の先頭表示データを以下のように計算したのですが、  ブラウザにエラーが表示されてしまいました。  <xsl:variable name="TopData" select="$TopData=$TopData-$Page" /> (2)urlのパラメータを取得する方法について  nextボタンを以下のように記述しました。 <a href="photo.xml?TopData={$TopData}"> <img width="30" height="30" src="img/aaa.gif" /> </a>  ここで与えたパラメータを、同じxlstファイルで取得し、  値を使うにはどのように記述したらよろしいでしょうか? ご教授おねがいいたします。

    • ベストアンサー
    • XML
  • rexmlで・・・

    Ruby初心者です。 rexmlを用いてXMLを扱うことになったのですが、出力がうまくいきません。 XMLファイル <hoge> <item> <name>○○○</name> <data>・・・・・</data> <data>・・・・・</data> </item> <item> <name>○○○</name> <data>・・・・・</data> <data>・・・・・</data> </item> </hoge> 上記のようなXMLファイルから<name>と<data>を取り出して出力しようと思っています。 見よう見まねで以下のようなコードを書いたのですが、これだと複数ある<data>が1つしか取れませんでした。 xml = REXML::Document.new(open("・・・・")) xml.elements.each("hoge/item") {|line| puts line.elements["name"].text puts line.elements["data"].text } ※都合で簡単に書き直したものをテストせずに載せています すべての<data>を出力したいのですが、どう書き直せばよいでしょうか? ご教授願います。

    • ベストアンサー
    • Ruby
  • JQueryでxmlのデータを取得する。

    以下のようになっているxmlのデータがあります。 --------------------- <item> <name1>0</name1> <name2>1</name2> <name3>0</name3> </item> --------------------- <item>~</item>の中の 子ノードのタグ名とテキストデータをJQueryを使って取得したいと考えています。 上記のように、<name1><name2><name3> とタグ名がバラバラなので 配列で取得したいのですが。やり方がわかりません。 どなたかご教授ください。

    • ベストアンサー
    • AJAX
  • xsl:chooseでこんなことがしたい

    はじめまして。XML初心者です。 元データとなるXMLを読み込んでHTML変換する為のスタイルシートの作成を試みています。 xsl:chooseを使って以下のようなことがしたいのですが、 ご存知の方いましたら教えてください(xsl:chooseに拘りはありません) ・元データの基本構造 ------------------------------------------------------ <A> <B> <C1>てすと</C1> </B> </A> ------------------------------------------------------ ・やりたいこと  <C1>の要素内容がNULLなら"★"マークを表示したい。 作ったスタイルシート ------------------------------------------------------ ~ <xsl:choose> <xsl:when test="C1=''">★</xsl:when> <xsl:otherwise><xsl:value-of selct="C1"/></xsl:otherwise> </xsl:choose> ~ ------------------------------------------------------ という感じで試したらうまく”★”マーク表示ができたのですが、対象のXMLデータに例外があり、 <C1>以下の要素がない場合があったのです。 この例外でも同様の”★”表示させたいのですが、うまい方法ご存知の方いましたら教えてください。

    • ベストアンサー
    • XML

専門家に質問してみよう