• 締切済み

重複するものを消したい

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
  • 回答数1
  • ありがとう数2

みんなの回答

回答No.1

テストケースの作り方が悪い。再現しないんで何がいいたいか伝わらないよ(笑) pop-bombさんのいいたそうなことを予測します。(外れるかもしれない) うまく行くかも自信ない ==================================== 以下のようなXMLファイルを考える #gooのシステムの都合上,well-formedじゃなくなるかもしれないけど,それはgooのせいです。(空白に良く似た文字が挿入されることが多いので 良く探してください) #まぁわかるよね,ってことで,その時は修正してください <?xml version="1.0" encoding="UTF-8"?> <list> <item> <title>チョコレート</title> <value>200円</value> <shops> <shop>○○ストア</shop> <shop>スーパー△△</shop> <shop>駄菓子屋□□</shop> </shops> </item> <item> <title>本</title> <value>1000円</value> <shops> <shop>○○ブックス</shop> <shop>△△百貨店</shop> <shop>スーパー△△</shop> <shop>スーパー××</shop> </shops> </item> <item> <title>うめぼし</title> <value>100円</value> <shops> <shop>スーパー○○</shop> <shop>△△百貨店</shop> <shop>通販○○</shop> </shops> </item> </list> このとき,本を販売する,異なるスーパーが二つ以上存在するようにしたことに注意。 ここで,以下のXSLTを適用すると <?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:template match="/"> <data> <xsl:apply-templates select="list/item/shops" /> </data> </xsl:template> <xsl:template match="shops"> <xsl:for-each select="shop"> <xsl:if test="contains(.,'スーパー')"> <li><xsl:value-of select="../../title" /></li> </xsl:if> </xsl:for-each> </xsl:template> </xsl:stylesheet> ========================= <data> <li>チョコレート</li> <li>本</li> <li>本</li> <li>うめぼし</li> </data> =========================== という出力結果が得られる。 ($whereは面倒くさいのでリテラルで置き換えました。 また、この要素がsiblingと等しくないのが常に成り立つのは明らかなので省略。) しかし、これは「本」が重複してしまっているので <data> <li>チョコレート</li> <li>本</li> <li>うめぼし</li> </data> としたい。 ========================== そこで <?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:template match="/"> <data> <xsl:apply-templates select="list/item/shops/shop[contains(text(),'スーパー')]/../../title" /> </data> </xsl:template> <xsl:template match="title"> <li><xsl:value-of select="text()" /></li> </xsl:template> </xsl:stylesheet> というXSLTを作成し、適用したところ, 期待する結果が得られた。

関連するQ&A

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

    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
  • お願いします。

    教えてください。 <ALL>  <ITEM>   <ITEMS>一</ITEMS>   <ITEMS2>1</ITEMS2>  </ITEM>  <ITEM>   <ITEMS>二</ITEMS>   <ITEMS2>2</ITEMS2>  </ITEM> </ALL> というようなXMLに <xsl:for-each select="ALL/ITEM">  <xsl:value-of select="ITEMS" /><BR /> </xsl:for-each> という処理をかけると、一<BR>二<BR>のように表示されますが、常に一番最初のITEMS(この場合、一)が欲しいときはどうすればいいのでしょうか。 <xsl:value-of select="ITEMS[1]" />や <xsl:value-of select="ITEMS[position()=1]" /> 等を試してみましたが、現在の値が抽出されてしまい失敗しました。参考ページでもいいので教えてください。お願いします。

    • 締切済み
    • XML
  • XSLでの指定方法

    こういったXMLファイルがあり、 XSLにて変換をしたいと思っています。 <success> <table> <list> <row> <value>value1</value> <value>value2</value> <value>2</value> <value>10</value> <value>20</value> </row> ・ ・ ・ ・ </list> </table> </success> 上の例にある、 <value>20</value> valueの5番目が20以上のときだけ 色を変更して表示したいと思っています。 xslで <xsl:for-each select="value"> <xsl:if test="value[5]&gt;= 20"> <xsl:attribute name="bgcolor">255,50,50</xsl:attribute> <xsl:value-of select="."/>, </xsl:if> としたのですが、 うまくいきません。 条件式が問題だとは思いますが、 どのような式にしたらよいのでしょうか?

    • ベストアンサー
    • 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
  • xslでの表示

    例えば <title>タイトルA</title> <P>no1</P> <P>no2</P> <P>no3</P> <P>no4</P> <title>タイトルB</title> <P>no5</P> <P>no6</P> <P>no7</P> <P>no8</P> というようなxmlがあったとします。 xslを適用して、 タイトルA no1 no2 no3 no4 タイトルB no5 no6 no7 no8 と表示するにはどのようにすればよいのでしょうか? <xsl:for-each select="//P">  <P><value-of select="."/></P> </xsl:for-each> ではnoのみが表示され、タイトルが表示されず、また、 <xsl:for-each select="//title">  <P><xsl:value-of select="."/></P>  <xsl:for-each select="../P">   <P><xsl:value-of select="."/></P>  </xsl> </xsl> では、 タイトルA no1 no2 no3 no4 no5 no6 no7 no8 タイトルB no1 no2 no3 no4 no5 no6 no7 no8 となってしまいます。

    • ベストアンサー
    • 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
  • for-eachが上手くいきません

    xslを使ってごくごく基本的なことをしようとしているのですが、何故か上手くいかず煮詰まっています。 ここが違う!というツッコミを是非よろしくお願いします。 ごく単純なことですが、xmlで複数の<site></site>内にあるデータそれぞれ表示させるためxslファイル内でfor-eachを使っています。for-each抜きだと一つ目の<site></site>がちゃんと表示されるのですが、for-eachを付け加えた途端何も表示されなくなってしまいます。 参考書を見て何度確認、やり直しをしても上手くいかず困っています。 使っているコードは以下の通りです。 XMLファイル: <?xml version="1.0" encoding="Shift-JIS" ?> <?xml-stylesheet type="text/xsl" href="links.xsl" ?> <links> <site> <name>サイト1</name> <banner>some.jpg</banner> </site> <site> <name>サイト2</name> <banner>other.jpg</banner> </site> </links> 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> <table border="1"> <xsl:for-each select="links/site"> <tr> <td> <img> <xsl:attribute name="src"> <xsl:value-of select="links/site/banner" /> </xsl:attribute> </img> <b><xsl:value-of select="links/site/name" /></b> </td> </tr> </xsl:for-each> </table> </body> </html> </xsl:template> </xsl:stylesheet> 何かアドバイスがありましたらお聞かせ下さい。

    • ベストアンサー
    • XML
  • htmlに変換されない

    xmlを勉強しています。 しかし、ブラウザでxslファイルを 開いてもhtmlに変換されないまま表示されます。 何が問題なのでしょうか? 両方ともデスクトップに作った同じフォルダの中に 格納しています。 ブラウザは、ie7です。 ------------------------------------------------------ xmlファイル zen.xml <?xml version="1.0" encoding="SHIFT_JIS"?> <?xml-stylesheet type="text/xsl"href="zen.xsl"?> <全体> <情報> <名前>ニコルソン</名前> <住所>アメリカ</住所> </情報> <情報> <名前>フランク</名前> <住所>イタリア</住所> </情報> </全体> -------------------------------------------------- xslファイル zen.xsl <?xml version="1.0" encoding="SHIFT_JIS"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl"> <xsl:template match="/"> <html lang="ja"> <head> <title>顧客情報</title> </head> <body> <div> <xsl:apply-templates select="全体"/> </div> </body> </html> </xsl:template> <xsl:template match="全体"> <xsl:for-each select="情報"> <ul> <li><xsl:value-of select="名前"/></li> <li><xsl:value-of select="住所"/></li> </ul> </xsl:for-each> </xsl:template> </xsl:stylesheet>

    • 締切済み
    • XML
  • ファイルサーバの日本語フォルダ名へのリンク

    勉強しはじめで質問内容にも至らない点があるかと思いますが何卒アドバイスをお願いいたします。 イントラを作成するにあたり、ファイルサーバー上の日本語名フォルダにリンクしたいのですが、文字化けをしてしまいます。ソースは下記のような感じです。 ■xmlファイル「test.xml」 <?xml version="1.0" encoding="UTF-8" standalone="yes"?> <root> <item> <title>日本語フォルダ名</title> <link>\\test01¥テストデータ</link> </item> <item> <title>管理</title> <link>\\test01\経費管理</link> </item> </root> ■xslファイル「test.xsl」 <?xml version="1.0" encoding="utf-8"?><!-- DWXMLSource="test.xml" --> <!DOCTYPE xsl:stylesheet [ <!ENTITY nbsp " ">  中略 <!ENTITY euro "?"> ]> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="html" encoding="utf-8"/> <xsl:template match="/"> <xsl:for-each select="root/item"> <a href="{link}"><xsl:value-of select="title"/></a><br /><br /> </xsl:for-each> </xsl:template> </xsl:stylesheet> これをオーサリングソフト(Dreamweaver8を使用)でプレビューすると、日本語フォルダ名が文字化けをしてしまいリンクができません。 ファイル名を半角英数にすれば済む話ではあるのですがあまりに大量のファイルがあるのと、管理上の問題でフォルダ名はなんとか日本語のままで使用したく考えております。 お手数ですが回避策、代替案などございましたら教えていただけると助かりますので何卒よろしくお願い申し上げます。

    • ベストアンサー
    • XML
  • Ajax.RequestでXMLデータをパース

    お世話になります。 Ajax.Requestをして、返ってくるデータがXMLなのですが このXMLをパースして表示したいのですが 何か方法はありませんでしょうか? もしかしたら簡単なことなのかもしれませんが ご存知の方がいらっしゃいましたら ご教授よろしくお願いいたします。 ajax.js //////////// function exec(fname,dispArea) { var httpObj = new Ajax.Request(fname, { method:'GET', onSuccess:function(req) { var text = req.responseText; $(dispArea).innerHTML = text; } } ); } ///////////test.html <script language="javascript" type="text/javascript" src="prototype.js"></script> <script language="javascript" type="text/javascript" src="scriptaculous.js"></script> <script language="javascript" type="text/javascript" src="ajax.js"></script> <span id="disp">exec('hoge.xml', 'disp');</script></span> //////////// hoge.xml <?xml version="1.0" encoding="UTF-8"?> <?xml-stylesheet type="text/xsl" href="hoge.xsl" ?> <top> <list> <row>テスト1</row> </list> <list> <row>テスト2</row> </list> <list> <row>テスト3</row> </list> </top> //////////// hoge.xsl <?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:template match="top"> <html><title>XMLパース</title> <body> <xsl:for-each select="list"> <xsl:value-of select="row" /> </xsl:for-each> </body> </html> </xsl:template> </xsl:stylesheet>

専門家に質問してみよう