XSLTで可変要素のHTML表示を作成する方法

このQ&Aのポイント
  • XSLTを使用して、可変要素のHTML表示を作成する方法について教えてください。
  • XMLからHTMLへの変換には、XSLTが利用できます。特に、<book>要素の子ノードが可変であり、要素名が事前にわからない場合にXSLTを作成する方法を知りたいです。
  • XSLTを使用して、可変要素のHTML表示を行うためには、<xsl:for-each>ループを使用して<book>の子要素を処理し、<table>要素の<tr>と<td>要素を作成する方法が一般的です。
回答を見る
  • ベストアンサー

XSLTについて

何方かご存知でしたら、ご教授下さい。 こんなXMLがあります。 <book>  <ジャンプ>200円</ジャンプ>  <マガジン>210円</マガジン>  <サンデー>200円</サンデー> : :(可変) </book> 上記のXMLをHTMLでこのように表示します。 <table>  <tr>   <td>ジャンプ</td>   <td>200円</td>  </tr>  <tr>   <td>マガジン</td>   <td>210円</td>  </tr>  <tr>   <td>サンデー</td>   <td>200円</td>  </tr> </table> <book>の子ノードは可変で、どんな要素名がくるかわかりません。 このときにどのようなXSLTを作成すればよいでしょうか? 宜しくお願い致します。

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

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

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

好みの都合で余計なものいっぱいくっついているけど =================Q4511114-1.xml(入力)=============== <?xml version="1.0" encoding="UTF-8"?> <book> <ジャンプ>200円</ジャンプ> <マガジン>210円</マガジン> <サンデー>200円</サンデー> </book> =================Q4511114-1.xsl(変換)============= <?xml version="1.0" encoding="UTF-8"?> <!-- 教えてgooのシステムはURIっぽい文字列の前後にNO WIDTH SPACEをつけるため,回答をそのままコピーしても動きません --> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns="http://www.w3.org/1999/xhtml" version="1.0"> <xsl:output method="xml" version="1.0" encoding="UTF-8" omit-xml-declaration="no" standalone="no" doctype-public="-//W3C//DTD XHTML 1.1//EN" doctype-system="http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd" indent="yes" media-type="text/xml"/> <xsl:template match="/"> <html> <head> <title>Q4511114 TestCase 1</title> </head> <body> <xsl:apply-templates /> </body> </html> </xsl:template> <xsl:template match="book"> <table> <xsl:for-each select="*"> <tr> <td><xsl:value-of select="local-name(.)" /></td> <td><xsl:value-of select="text()" /></td> </tr> </xsl:for-each> </table> </xsl:template> </xsl:stylesheet> ==================Q4511114-2.xml(結果)============ <?xml version="1.0" encoding="utf-8" standalone="no"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <title>Q4511114 TestCase 1</title> </head> <body> <table> <tr> <td>ジャンプ</td> <td>200円</td> </tr> <tr> <td>マガジン</td> <td>210円</td> </tr> <tr> <td>サンデー</td> <td>200円</td> </tr> </table> </body> </html>

k_tanpin
質問者

お礼

回答ありがとうございます。 特定のものにmatchさせてから、<xsl:for-each select="*">であるだけまわすんですね。 なんとなくコツがわかりました。 どうもありがとうございました。

関連するQ&A

  • XSLTの記述方法

    お世話になります。 XML+XSLTで開発しております。 XSLTの記述方法でjavascriptの引数にXMLデータを挿入する記述は どうすればよいのでしょうか? すごい初歩的な質問かもしれませんが ご教授よろしくお願いいたします。 <?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:template match="/"> <table> <tr> <td > <a href="#" onClick="hogehoge('pram')">hogehoge rink </a> </td> </tr> </table> </xsl:template> </xsl:stylesheet> ↓↓↓↓↓↓こんな感じにしたい↓↓↓↓↓↓ <a href="#" onClick="hogehoge('<xsl:value-of select="$prm_test"/>')">りんく</a>

    • ベストアンサー
    • XML
  • XMLをXSLTで変換するとき、XMLの要素名をそのまま表示したいのですが…

    お世話になっております。 XMLとXSLTの勉強をしているのですが、 XMLの要素名をXSLTで変換したときそのまま表示することは可能でしょうか? ---------------------------------------------------------- コレクション.xml ---------------------------------------------------------- <コレクション>  <書籍リスト>   <書籍>    <NO>001</NO> <!--↓”タイトル”という文字列を何らかのXSLT要素でHTML直書きせずにに表現したいのです↓-->    <タイトル>ド●えもん第一巻</タイトル>    <ジャンル>マンガ</ジャンル>    <価格>\410</価格>   </書籍>  </書籍リスト> </コレクション> ---------------------------------------------------------- 出力例 ---------------------------------------------------------- //↓ここにXML要素名を入れるなんてできるのでしょうか? タイトル    |ジャンル|価格| --------------------------------- ド●えもん第一巻|マンガ |\410| どなたか、ご教授の程、宜しくお願いいたします。

    • 締切済み
    • XML
  • HTMLのテキストノード部分を変更するには?

    <table> <tr><td>あああ<span>いいい</span></td></tr> </table> 上記のようなHTMLについて、 「あああ」のテキストノード部分のみを 「ううう」というように別の文字列へJavaScriptを用いて変更するには どのような方法が考えられるでしょうか?

  • XMLをXSLTやCSSに変換してHTMLで出力

    XMLデータ <?xml version="1.0" encoding="Shift-JIS"?> <flower> <naiyou> 本文 </naiyou> <name>花言葉</name> <flow><name>あきらめ </name></flow> <flow><list>悲しい思い出 </list></flow> <flow><name>情熱 </name></flow> <flow><list>独立 </list></flow> <flow><name>再会 </name></flow> <flow><list>想うはあなた一人 </list></flow> <flow><name>また会う日を楽しみに </name> </flow> </flower> を変換したいのです。 XSLTデータ <?xml version="1.0" encoding="Shift-JIS"?> <xsl:stylesheet version="1.0" xmlns:xsl="F:\i08i008\I08I008.html"> <xsl:output method="html"/> <xsl:template match="/"> <html><xsl:apply-templates/></html> </xsl:template> <xsl:template match="flower"> <h1>彼岸花</h1>  <xsl:apply-templates/>  </xsl:template> <xsl:template match="naiyou"> <p><xsl:value-of select="."/></p> </xsl:template> <xsl:template match="flow"> <xsl:value-of select="name"/> <table flame="border" width="50%"> <tr><th>彼岸花</th><th>花言葉</th></tr> <xsl:for-each select="flow"> <tr> <td><xsl:value-of select="name"/></td> <td><xsl:value-of select="list"/></td> </tr> </xsl:for-each> </table> </xsl:template> </xsl:stylesheet> ここまで作ったのですが、うまくHTMLに出力できません。原因がわかる方、教えてください。 イメージ図 <html> <head> <title>彼岸花</title> </head> <body> <div style="font-weight:bold"> 彼岸花 </div> ヒガンバナ科ヒガンバナ属の多年草。別名「曼珠沙華」という別名があるのは有名だが、他にも呼び名があるのは知られていない。<br> ただ、その名前が「地獄花」、「捨子花」などと縁起でもない名前ばかりである。<br> その中でも何故「はっかけばばあ」という呼び名があるのかは疑問である。<br> <img src="http://farm1.static.flickr.com/120/252830085_712ffd338b.jpg"width="171" height="171"><br> <br> <table border="1"bgcolor="#b22222"> <tr> <th colspan="2">彼岸花</th> </tr> <tr> <th colspan="2">花言葉</th> </tr> <tr> <th>悲しい思い出</th> <th>独立</th> </tr> <tr> <td>独立</td> <td>諦め</td> </tr> <tr> <td>再開</td> <td>情熱</td> </tr> </table> </body> </html> XSLTについては(CSSもそうですが)、イメージ図の通り、写真を掲載したりや表に配色をしたいとも考えております。そのあたりのアドバイスも頂けると嬉しいです。 あとCSSについてもサイトで色々見たのですが、どれもさっぱり解かりませんでした。初心者な私にでも解かりやすいサイト教えてください。一から勉強しているところです。 CSSはこういう風に記述するんだよ、と簡単に教えて頂ける優しい方もいたら回答お願いします。サイトだけでは悪戦苦闘しそうなもので…。物凄い不安です。

    • 締切済み
    • XML
  • 指定した要素を含んだテキストで取得する

    <table>  <tr id="aaa"><td>あああ</td></tr>  <tr><td>いいい</td></tr> </table> <script> alert(document.getElementById("aaa").innerHTML) </script> 上記のようなHTMLを実行すると 「<td>あああ</td>」と表示されますが これをid指定されている<tr>要素を含んだ形で 即ち「<tr id="aaa"><td>あああ</td></tr>」というように 取得するにはどのような方法が考えられるでしょうか?

  • 今、HTMLメルマガを作成し、テスト配信等々をいろいろと試しているので

    今、HTMLメルマガを作成し、テスト配信等々をいろいろと試しているのですが、どうもoutlook2007だけエラーが発生します。どなたか解決策が分かる方いらっしゃいましたら、ご教授願えないでしょうか? ■発生するエラー HTML内の一部のテキストリンクがクリックできない。 画像に貼ったリンクはクリックできる。 全て同じレイアウトで記載しているため、エラーが発生していない箇所(正常にクリックできる)のHTMLソースをエラーが発生しているHTMLのソースに上書きしてもテキストリンクはクリック出来ない。 ■エラー発生の原因 いろいろと調べていくと、HTMLソースは全て、TABLEコーディングを使用しており、TABLEの中にTABLEを記載しているような状態です。その、階層が深くないとテキストリンクは正常にクリックでき、階層が深いとクリックできなくなります。 階層を浅くすると正常になるのですが、背景色などの関係で、これ以上、浅くは出来ない状態です。 ------------------------------------------ (例)階層が浅い例 <table> <tr> <td><table> <tr> <td>あああ</td> </tr> </table></td> </tr> </table> (例)階層が深い例 <table> <tr> <td><table> <tr> <td><table> <tr> <td><table> <tr> <td><table> <tr> <td>あああ</td> </tr> </table></td> </tr> </table></td> </tr> </table></td> </tr> </table></td> </tr> </table> ------------------------------------------ 以上が発生をしているエラーですが、どなたか、階層が深い状態でも 全てのテキストリンクがクリックできる方法はないでしょうか? よろしくお願いいたします。

    • ベストアンサー
    • HTML
  • CSSだけで<table>の<td>や<tr>要素を並べ替えることができAますでしょうか?

    CSSだけで<table>の<td>や<tr>要素を並べ替えることができAますでしょうか? 例えば、HTMLで一行に3列になるよう以下の様に記述した時に <table> <tr> <td> <p>テキスト左</p> </td> <td> <p>テキスト中</p> </td> <td> <p>テキスト右</p> </td> </tr> </table> CSSでのそうさのみによって 見栄え的に縦3行、横1列に見えるようにできますでしょうか? 幅などをピクセル制限したりするのでも構いません。 もしHTMLで実現するとするならば <table> <tr> <td> <p>テキスト左</p> </td> </tr> <tr> <td> <p>テキスト中</p> </td> </tr> <tr> <td> <p>テキスト右</p> </td> </tr> </table> 上記のような記述になると思いますが、あくまで最初のHTMLをCSSで変更して、HTML本体は書きかえない方法です。 もし、何らかの形で実現できそうな場合がありましたらアイディアをください。 お忙しいところお手数おかけしますが、よろしくお願いいたします。 ※CSS記述の変更のみ。 ※特定のブラウザに依存させたくない。 ※Javasprictは使用しない。

  • PHPでHTMLをXMLに変換したときに消える内容

    教えてください。 スクレイピングのために、よく分からないままに、 PHPでHTMLをXMLに変換して、Xpathで参照しようとしています。 が。 その前段で、「HTML内に存在する内容が、XMLに変換した際に 消えてしまう」という現象に悩まされております。 例を挙げますと、 --------------------------------------- <html> <body> <table> <tr> <td><b>foo</b> bar<br> </td> </tr> </table> </body> </html> --------------------------------------- みたいなページを、 --------------------------------------- <?php $html = file_get_contents('http://xxxxxxxxxxxxxxxxx.com/foobar.html'); $dom = new DOMDocument(); @$dom->loadHTML($html); $xml = simplexml_import_dom($dom); print_r($xml); ?> --------------------------------------- のように処理すると、 --------------------------------------- SimpleXMLElement Object ( [body] => SimpleXMLElement Object ( [table] => SimpleXMLElement Object ( [tr] => SimpleXMLElement Object ( [td] => SimpleXMLElement Object ( [b] => foo [br] => SimpleXMLElement Object ( ) ) ) ) ) ) --------------------------------------- のような結果になって、「あれ?fooはいるけど、barは何処いった?」となります。 分かっている方には、「そりゃ、おまえ、あたりまえだよwww」 「つーか、なにやっとんのwww」って感じなのかもしれませんが、 さっぱり分かりません。 元のHTMLの書きぶりがダメだからということでしょうか。 お手数をお掛けしますが、どうぞ、ご教授ください。 よろしくお願いいたします。

    • ベストアンサー
    • PHP
  • jQueryで最後の1文字を消したい

    tableのtd要素内のテキストの最後の文字をjQueryで消したいのですが、うまくいきません。 どのようにしたらよいでしょうか? 【HTML】 <table> <tr><td>あああ</td><td class="iii">いいいい</td></tr> </table> 【JavaScript】 var str = $('.iii').text(); var str2 = str.slice(0, -1); $('.iii').text(str2);

  • XSLT変換について

    以下のようにファイルを作成してみました。 ローカルではIEに表示できるのですが,アップすると表示されず「スタイルシートにドキュメント要素が含まれていません。スタイルシートが空であるか、正しく構成された XMLドキュメントでない可能性があります。」というコメントが出ます。ご存知の方いらっしゃいましたらどうか教えてください。 ↓作成したファイル 「top.xml」(省略) 「top.xsl」 <?xml version="1.0" encoding="Shift_JIS" ?> <xsl:stylesheet xmlns:xsl="(省略)" version="1.0"> <xsl:import href="./note.xsl" /> <xsl:output method="html" encoding="Shift_JIS" /> <xsl:template match="/">  <html xmlns="(省略)" xml:lang="ja" lang="ja">  <head>   <meta http-equiv="Content-Type"    content="text/html; charset=Shift_JIS" />   <title><xsl:value-of   select="/top/title" /></title>  </head>  <body>   <xsl:call-template name="header" />   <div align="center"><h1>HOME PAGE</h1></div>   <table> <tr><th>CONTENTS</th></tr> <xsl:for-each select="/top/contents"> <tr><th><a href="{url}"><xsl:value-of      select="label" /></a></th>      <td><small><xsl:value-of      select="text" /></small></td></tr> </xsl:for-each>   </table><br />   <xsl:call-template name="footer" />  </body>  </html> </xsl:template> </xsl:stylesheet> 「note.xsl」(top.xslにおけるxsl:importをコメントアウトしても結果は変わらなかったため,記載省略。)

    • 締切済み
    • XML

専門家に質問してみよう