
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>
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が見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
重複するものを消したい
-
XSLTの動作
-
XMLをXSLを使いHTMLに変換した...
-
XSLTにてタグ名を取得する方法
-
XML、XSLTの適応エラー(IEから...
-
MSXML で Windows-31J のキャラ...
-
(VB.NET)TreeViewのノード文...
-
XMLパースエラー
-
4バイトを10進数に変換する方法
-
SNMP リンクダウンとノードダ...
-
C# TreeView 効率良いノード追...
-
昔Winnyってありましたけど、あ...
-
Visual Basic .NET の識別子は...
-
XMLで要素が記述された順番に意...
-
複数のマックPCによる数値計算...
-
CPUの考え方を教えてください ...
-
Windowsで見かけるxmlファイル...
-
ルート要素ノードが2個ある場合?
-
TreeView の初期表示について
-
Excel(2007以降)をxml形式に変...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
xmlのテキストにリンクを張りた...
-
タグの有無の判定
-
XSLTにてタグ名を取得する方法
-
XMLをXSLを使いHTMLに変換した...
-
XSLで、XMLの空タグを制御したい。
-
XSLTで固定長データファイルを...
-
XMLとXSLTでリンクを張る方法
-
ある文字列を含むノードが存在...
-
XMLのスタイルシートで単独タグ...
-
XSL内でJavaScriptを記述し、Ja...
-
XMLからcsvへの変換
-
スタイルシートを使用したXM...
-
xmlから吐き出したhtmlデータの...
-
うまく表示されない
-
空かスペースを認識させること...
-
xslでの最小値、最大値の取得
-
XMLのHTMLへの変換 (初心者)
-
XSLでノードの順番取得
-
htmlに変換されない
-
CPUの考え方を教えてください ...
おすすめ情報