• ベストアンサー

簡単なことだと思うんですが・・・

XML初心者のものです。 要素の中に要素を生成するXSLを作ったのですが、 生成されません。 XMLは - <item no="1"> <title>プログラムの基礎</title> <creator>Heinemeier Hansson</creator> <publisher>オーム社</publisher> - <keywords> <keyword>プログラミング</keyword> <keyword>ソフトウェア</keyword> <keyword>入門</keyword> </keywords> </item> となっており、 XSLは <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:template match="/"> <list> <xsl:apply-templates select="books/item/keywords/keyword"/> </list> </xsl:template> <xsl:template match="keyword"> <category> <xsl:value-of select="."/> <xsl:apply-templates select="books/item/title"/> </category> </xsl:template> <xsl:template match="title"> <title> <xsl:value-of select="."/> </title> </xsl:template> </xsl:stylesheet> としています。 生成されるXMLは、 <list> <category>プログラムの基礎</category> </list> となり、<title>が入りません。 解決策を教えてくださいm(_ _)m

  • XML
  • 回答数9
  • ありがとう数14

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

  • ベストアンサー
  • SAYKA
  • ベストアンサー率34% (944/2776)
回答No.8

No7の方法は表記的には合っているけれど正しくないよ。 理由は item が複数有った場合正しい node を参照できていない可能性が有るから。 >で、どうやって解決したらよいのでしょうか?? 見えないと判ったんだから見える所から持ってくるか、見える所から投げるか、って形に書き換えるしかないよ。 つまり A. match="item" の段階を作ってそこで生成する形に変更するか B. 現状の形で keyword で投げる時に title も渡すか C. rootで全部処理しちゃうか のどれか。 Bで要りそうなもの http://www.infoteria.com/jp/contents/xml-data/REC-xslt-19991116-jpn.htm#section-Passing-Parameters-to-Templates http://www.google.co.jp/search?q=xslt%20with-param&hl=ja&lr=lang_ja Cで要りそうなもの http://www.infoteria.com/jp/contents/xml-data/REC-xslt-19991116-jpn.htm#for-each 因みに「つまりどういうソース?」と聞かれてもそれは丸投げになっちゃうから答えてあげられない。

その他の回答 (8)

  • auty
  • ベストアンサー率58% (284/486)
回答No.9

またまた挑戦です。 ・ 複数のitemとkeywordsに対処したつもりです。 -------------------------------------------------------------------- <?xml version="1.0" encoding="utf-16"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:template match="/"> <list> <xsl:apply-templates select="books"/> </list> </xsl:template> <xsl:template match="books"> <xsl:for-each select="item"> <xsl:for-each select="keywords"> <xsl:apply-templates select="."/> </xsl:for-each> </xsl:for-each> </xsl:template> <xsl:template match="keywords"> <xsl:for-each select="keyword"> <category> <xsl:value-of select="."/> <title> <xsl:value-of select="../../title"/> </title> </category> </xsl:for-each> </xsl:template> </xsl:stylesheet>

  • auty
  • ベストアンサー率58% (284/486)
回答No.7

XSLを書き直してみました。 ------------------------------------------------------ <?xml version="1.0" encoding="utf-16"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:template match="/"> <list> <xsl:apply-templates select="books/item/keywords"/> </list> </xsl:template> <xsl:template match="keywords"> <xsl:for-each select="keyword"> <category> <xsl:value-of select="."/> <title> <xsl:value-of select="/books/item/title"/> </title> </category> </xsl:for-each> </xsl:template> </xsl:stylesheet> ------------------------------------------------------

  • SAYKA
  • ベストアンサー率34% (944/2776)
回答No.6

ごめん よく見ると book じゃなくて books だね・・・・・

  • SAYKA
  • ベストアンサー率34% (944/2776)
回答No.5

><xsl:template match="title"> >が実行されないかわからないのです。 ><xsl:apply-templates select="books/item/title"/> >がCの関数に飛ばす文と同じように思っており、 Cなら判るんだね。 なら ---------------------------------- - <item no="1"> <title>プログラムの基礎</title> <creator>Heinemeier Hansson</creator> <publisher>オーム社</publisher> - <keywords> <keyword>プログラミング</keyword> <keyword>ソフトウェア</keyword> <keyword>入門</keyword> </keywords> </item> ---------------------------------- 多分この親として<book>で囲ってあってitemが複数あるんだと思う。 これをちょっとCっぽい形にしてみようか item[0] {  no = 1;  title = { "プログラムの基礎" };  creator = { "Heinemeier Hansson" };  publisher = { "オーム社" };  keywords =  {   keyword[0] = "プログラミング";   keyword[1] = "ソフトウェア";   keyword[2] = "入門";  }; }, item[1] {  //... }; 若干違うんだけどこんな感じだと思ってくれたら大丈夫。 そんで xsl:template は 呼ばれて実行するのと適合で実行するのと2系統の実行の仕方が有って 今回のは後者の方法。 イベントを投げるとそのイベントが受け取れる関数が呼ばれるよね? 適合系の場合はこれに似ていて受け取れる「nodeName」であった場合に実行される。(matchの部分) だとして ><xsl:template match="/"> 有無を言わさずroot処理なのは判ると思う。 実際ここは必ず適合して実行される。 ><xsl:template match="keyword"> これは投げた物、 nodeName が keyword なら実行される。 ><xsl:template match="title"> 同じく「投げた物が」 title なら実行される。 (正しくは投げた中にtitleが有ればそこを起点に実行される) match="/" でのカレント node = {root : {"book" : {"item","item",...} } , ...}; そこの中で投げてる場所 ><xsl:apply-templates select="books/item/keywords/keyword"/> これを受けて match="keyword" が適合。そこでのカレント node = { "keyword":"プログラミング" },{ "keyword":"ソフトウェア"},...; (複数個のkeywordを投げられているのでその時によって keyword="プログラミング"→keyword="ソフトウェア" と値が変わる) そこの中で投げてるのは ><xsl:apply-templates select="books/item/title"/> 今有るのは・・・ node = { "keyword":"プログラミング" },{ "keyword":"ソフトウェア"},...; 投げる物が無い、の意味、判りそう?

ionwide
質問者

お礼

まさかとは思っていましたが、 やはり下っ端は上位にはいけないんですね… すごく使え勝手が悪いですね>< で、どうやって解決したらよいのでしょうか??

  • SAYKA
  • ベストアンサー率34% (944/2776)
回答No.4

>違うんでしょうか? 合ってるよ。 カレントは keyword なんだけど ><xsl:apply-templates select="books/item/title"/> →そんなものは無い が答え。

ionwide
質問者

お礼

それは分かっているのですが、 なぜ <xsl:template match="title"> <title> <xsl:value-of select="."/> </title> </xsl:template> が実行されないかわからないのです。 どうも <xsl:apply-templates select="books/item/title"/> がCの関数に飛ばす文と同じように思っており、 <xsl:template match="title"> がその関数だという考えがあるんですが、 XMLはどういう風になっているのか分からなくて

  • auty
  • ベストアンサー率58% (284/486)
回答No.3

「生成されるXMLは」が明示されていないようです。 一応、次のように仮定して試してみたいと思います。 ・ xslに "books/item/keywords/keyword" とあるので、xmlにも文書要素として、booksを加えます。 -------------------------------------------------------------------------------- <books> <item no="1"> <title>プログラムの基礎</title> <creator>Heinemeier Hansson</creator> <publisher>オーム社</publisher> <keywords> <keyword>プログラミング</keyword> <keyword>ソフトウェア</keyword> <keyword>入門</keyword> </keywords> </item> </books> -------------------------------------------------------------------------------- ・ <category>はどこに表示したらよいかわからないので無視します。 ・ <keyword>は最初のものだけと、全ての場合と、二つを取り上げます。 -------------------------------------------------------------------------------- <?xml version="1.0" encoding="Shift_JIS"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:template match="/"> <title> <xsl:value-of select="books/item/title"/> </title> <list> <xsl:value-of select="books/item/keywords/keyword"/> </list> </xsl:template> </xsl:stylesheet> -------------------------------------------------------------------------------- <?xml version="1.0" encoding="Shift_JIS"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:template match="/"> <title> <xsl:value-of select="books/item/title"/> </title> <xsl:apply-templates select="books/item/keywords"/> </xsl:template> <xsl:template match="keywords"> <xsl:for-each select="keyword"> <list> <xsl:value-of select="."/> </list> </xsl:for-each> </xsl:template> </xsl:stylesheet> -------------------------------------------------------------------------------- ・ xslがツリーを辿っていく時、適用されるテンプレートを探しながらルートノードから順に下へと始めます。 ・ 一度使われたテンプレートのノードの子孫は除かれていくと思います。

ionwide
質問者

お礼

すいません。 生成したいXMLが明白でなかったですね。 生成したいXMLは <list>  <category>  プログラミング   <title>    プログラミングの基礎   </title>  </category>  <category>  ソフトウェア   <title>   プログラミングの基礎   </title>  </category>  <category>  入門   <title>   プログラミングの基礎   </title>  </category> </list> としたかったんです。

  • SAYKA
  • ベストアンサー率34% (944/2776)
回答No.2

><xsl:apply-templates select="books/item/title"/>←ここ ここでmatchしているのは ><xsl:template match="keyword"> >>>XMLは 中略 >>>- <keywords> >>><keyword>プログラミング</keyword> さて逆に質問になっちゃうんだけど template match="keyword" ここで保持されているカレントノードの中身、どうなってるか判るかな? それが判るとなぜ投げられないのかが判るよ。 もし中身を補足してみるつもりなら 「判らない」じゃなく「こうかな?」で。

ionwide
質問者

補足

そこでのカレントノードは keywordだと思っていたんですが 違うんでしょうか?

  • SAYKA
  • ベストアンサー率34% (944/2776)
回答No.1

>となり、<title>が入りません。 ><xsl:apply-templates select="books/item/keywords/keyword"/> rootのmatchにはこれしかapplyが無いね。 titleを投げてる部分が無いんだけど・・・? って事じゃないかな。

ionwide
質問者

お礼

ご回答ありがとうございます。 titleは <xsl:template match="keyword"> <category> <xsl:value-of select="."/> <xsl:apply-templates select="books/item/title"/>←ここ </category> </xsl:template> のように投げているんですけど それでもうまくいきません><

関連するQ&A

  • 重複するものを消したい

    XMLをXSLでHTMLを生成しています。 変数$whereにある店の部分名を入力して その店の扱う商品を表示したいと思っています。 しかし、以下の例だと チョコレート 本 本 うめぼし のようになってしまいます。 チョコレート 本 うめぼし のように表示するにはどうすればよいでしょうか? ご教授ください。 XMLが以下のようになっています。 ()は要素の中身 list item title(チョコレート) value(200円)   shops shop(○○ストア)    shop(スーパー△△)   shop(駄菓子屋□□)  item title(本)   value(1000円)   shops shop(○○ブックス)    shop(△△百貨店)    shop(スーパー△△)  item title(うめぼし)   value(100円)   shops shop(スーパー○○)    shop(△△百貨店)    shop(通販○○) list そしてXSLは <xsl:apply-templates select="list/item/shops"> で飛ばして <xsl:template match="shops"> <xsl:for-each select="shop"> <xsl:if test="contains(.,$where)"> <xsl:value-of select="../../title[not(.=preceding::title)]"/> </xsl:if> </xsl:for-each> </xsl:template>

    • 締切済み
    • 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
  • XSLの中でHTMLタグが使えない

    XMLとXSLTを使って、Formの中のListのオプションを、XML から取ってきたいと思ってます。イメージ的には、下記 の○○○の中に、<xsl:value-of select="."/>を入れる ことによって、<option value="<xsl:value-of select="."/>"><xsl:value-of select="."/></option> の様にしたいのですが、<や>を&lt;や&gt;に変えても、 うまく表示されません。また、Selectタグの属性の Multipleも=サインが無いとかで使えませし,Inputタグ も、終了タグが無いため使えませんでした。どのように 対処したら良いのでしょうか?よろしくお願いしま す。 <select name="list1" size="10" id="select5"> <xsl:apply-templates/> </select> <xsl:template match="//name"> <option value="○○○">○○○</option> </xsl:template>

    • 締切済み
    • XML
  • xsl:variableでの抽出条件の変更

    こんにちは、Khazadと申します。  xsl:variableで、xsl:apply-templates の抽出条件を変更したくて 下記のようなXSLを作成したのですが、うまくいきません。  原因がわかる方。または別の方法があればご教授お願いできないでしょうか?  パーサーはMSXML3.0です。 (試したこと) 1 テンプレート内に<xsl:value-of select='$frid'/>を挿入すると、   ちゃんと1が表示されます。 2 [@rid='{$frid}']の部分を[@rid='$frid']に変更しても抽出は   行われません。 3 [@rid='{$frid}']の部分を[@rid='1']にすると抽出されます。  以下XSLのソースです -------------------------------------------------------- <xsl:variable name = 'frid' select='1' ></xsl:variable> <xsl:template match="/"> <xsl:apply-templates select="ROOT//*[@rid='{$frid}']"/> </xsl:template> <xsl:template match="*[@rid='{$frid}']"> <xsl:apply-templates select="*"/> </xsl:template> --------------------------------------------------------

    • ベストアンサー
    • XML
  • xpathでノードのポジションを得る

    position()でポジションを取得したいのですが、 <xsl:apply-templates select="//test[position()]" /> のようなかんじにしてtestノードのposition()リストを 取得するようなことはできないのでしょうか。 まあ、 <xsl:template match="test"> <xsl:value-of select="position()" /> </xsl:template> こういうテンプレートつくれば結果的に取れると思うんですが、 今回はこれはなしでお願いします。 xpathだけでpositionをしゅとくできないものでしょうか。

    • ベストアンサー
    • XML
  • 10番目以降の処理を変える

    こんにちは <a>  <b>bb</b>  <c>cc</c>  <d>dd</d> </a> <a>  <c>cc</c>  <d>dd</d>  <c>cc</c>  <d>dd</d> </a> といった不規則な構造のxmlで、例えば10番目以降の<a>内の<d>は表示しないといった処理をしたいと思っています。 xslを <xsl:template match="a">  <xsl:number />  <xsl:apply-templates /> </xsl:template> <xsl:template match="b">  <xsl:apply-templates /> </xsl;template> <xsl:template match="c">  <xsl:apply-templates /> </xsl;template> <xsl:template match="d">  <xsl:if test="ナンバーの値 < 10">  <xsl:apply-templates />  </xsl:if> </xsl;template> と書き、aのテンプレート内で指定した<xsl:number />の値をdのテンプレート内の<xsl:if >に持ってくる方法はあるでしょうか?

    • ベストアンサー
    • XML
  • 複数リンクをしたいのですが表示されない

    複数リンクしたいページがあったので色々試みました こちらのサイトを参考にして http://www6.airnet.ne.jp/manyo/xml/index.html Xlinkの単純リンク・拡張リンクを試したのですがリンクが全くされないで、普通に文字が並んでるように表示されました また http://questionbox.jp.msn.com/qa1821124.html こちらのやり方で試みてもリンクされていない状態でした。 XMLの書き方がまずかったのか、別の理由でリンク表示されないのかわかりませんがどうしたら複数リンクができるでしょうか? 大体こんな感じに書きました ↓XML <?xml version="1.0" encoding="Shift_JIS"?> <?xml-stylesheet type="text/xsl" href="anime1.xsl"?> <iti> <sait> <name>世界の発展</name> <gai> <link url="http://***">イギリス</link> <link url="http://***">フランス</link> <link url="http://***">イタリア</link> </gai> </sait> ↓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>テスト</title> </head> <body> <div align="center"> <xsl:apply-templates select="iti" /> </div> </body> </html> </xsl:template> <xsl:template match="iti"> <br /> <br /> <h1>テスト</h1> <xsl:apply-templates select="sait" /> <br /> <br /> </xsl:template> <xsl:template match="sait"> <table border="1" bgcolor="#006fdd" width="700"> <tr> <th><xsl:value-of select="name" /></th> </tr><tr> <td><xsl:value-of select="gai" /></tr> </table> <br /> </xsl:template> <xsl:template match="link" > <a> <xsl:attribute name="href"> <xsl:value-of select="@url" /> </xsl:attribute> <xsl:value-of select="text()" /> </a> </xsl:template> </xsl:stylesheet> どこら辺が間違ってますでしょうか?

    • ベストアンサー
    • XML
  • XSL内でJavaScriptを記述し、JavaScript内でXMLデータを取得するには・・・

    大変困っていますのでよろしくお願いします。 XSLのファイル内でJavaScriptを記述し、JavaScriptでxmlの要素を取得操作したいのですが、とり方がわかりません。 ご教授のほどをよろしくお願いします。 ================================================================== 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="/"> <html> <head> <title>XML: 基本サンプル</title> </head> <body> <p align="center">サンプル</p> <xsl:apply-templates select="information/value/applicationinfo" /> </body> </html> </xsl:template> <xsl:template match="value/applicationinfo"> <Script Language = "JavaScript"> <xsl:comment> <![CDATA[ document.write("<xsl:value-of select=\"componentname\" />"); ]]> </xsl:comment> </Script> <table border="1"> <tr> <td><xsl:value-of select="componentname" /></td> </tr> </table> </xsl:template> </xsl:stylesheet> ================================================================== 下のテーブルでは要素を表示することはできます。 このやり方では駄目なのでしょうか?

    • ベストアンサー
    • XML
  • 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/XSLでテンプレートの適用がうまくいかない

    同じツリーの深さで異なる要素名のノードがあるXMLだと期待通りにテンプレートが適用できない という問題に付き当たっています。 例えば    / +------+ poem  poem のような構成だとmatch=poem、value-of select="text"などで各poemの歌詞を表示させることが できます。 一方、以下の構成で同じ事をやろうとすると各poemの歌詞に加えてyearのnumのValueまで 列挙されてしまいます。poemの中身だけ出すにはどうすればよいでしょうか? 以下に例を書きます。     / +--------------+ list         year +------+      +----+ poem poem    Num Num 例えば以下のURLなどを参照してやっております。 http://www6.airnet.ne.jp/manyo/xml/xslt/step15.html XSLはこんな感じです。 <xsl:template match="/"> <xsl:apply-templates /> </xsl:template> <xsl:template match="poem"> <tr> <td><xsl:value-of select="poet" /></td> <td><xsl:value-of select="yomi" /></td> </tr> <br /> </xsl:template> 手持ちのXMLを変換したく、その勉強のため上記のような構成のXMLを扱う方法を 知りたいと思っています。 よろしくお願いします。

    • 締切済み
    • XML

専門家に質問してみよう