カテゴリ毎に属するエントリーの一覧表示

「まったく何も分からない・・・」そんなユーザーさんの為のフォーラムです。どんなご質問でもお気軽にどうぞ。
返信
shige
パワーユーザー
記事: 40
登録日時: 2006年4月04日(火) 14:25

カテゴリ毎に属するエントリーの一覧表示

投稿記事 by shige » 2008年3月21日(金) 21:00

いつもお世話になっております。shigeです。
また、質問をさせてください。

いま、aaa.schema.xmlというスキーマ定義の中に、

コード: 全て選択

<data name="attrib1" type="menu" group="True" caption="カテゴリー" >
  <menuitem id="10">ジャンルA</menuitem>
  <menuitem id="20">ジャンルB</menuitem>
  <menuitem id="30">ジャンルC</menuitem>
</data>
<data name="company" type="text" output="text2" minlength="1" caption="会社名" />
と「カテゴリー」と「会社名」を登録するスキーマをつくり、デザイン定義側で下記の様に、属するカテゴリー毎に会社名を一覧表示させたいのですが、うまくいきません。

コード: 全て選択

[ジャンルA]
・会社名AAA
・会社名DDD
・会社名FFF
  ・
  ・

[ジャンルB]
・会社名BBB
・会社名EEE
  ・
  ・

[ジャンルC]
・会社名CCC
デザイン定義側(aaa.list.default.design.xsl)では、

コード: 全て選択

<?xml version="1.0" encoding="UTF-8" ?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
  <xsl:output method="xml" encoding="EUC-JP" omit-xml-declaration="yes" />

<!-- スキーマファイルからカテゴリーリストを読み込み、$attrib1_listという変数に格納する -->
<xsl:variable name="attrib1_list" select="document('aaa.schema.xml')/schema/data[@name='attrib1']/menuitem" />

 <xsl:template match="/entrylist">

<xsl:for-each select="$attrib1_list">
  <div class="bg">
  <xsl:variable name="attrib1_id" select="@id" />
  <xsl:value-of select="text()" />
  </div>

  <ul>
    <xsl:for-each select="entry">
    <xsl:if test="attrib1=$attrib1_id">
    <li>
    <xsl:value-of select="company" disable-output-escaping="yes" />
    </li>
    </xsl:if>
  </xsl:for-each>
  </ul>
</xsl:for-each>

 </xsl:template>
</xsl:stylesheet>
・・というように、カテゴリ名をスキーマから取り出す<xsl:for-each>の中に、エントリーを取り出す<xsl:for-each>を入れ子にして、処理を回せばうまくいくと安易に考えていたのですが、上記の結果では、

コード: 全て選択

[ジャンルA]
[ジャンルB]
[ジャンルC]
と、カテゴリ名だけが出力され、中のエントリーを取り出す処理がうまく動いてくれませんでした。

処理の方向性として、根本的に間違っているのかもしれませんが、解決策が見出せんでした。

上記の表示を実現するにはどうしたら良いでしょうか?

webmaster
Site Admin
記事: 1451
登録日時: 2004年12月10日(金) 10:09

Re: カテゴリ毎に属するエントリーの一覧表示

投稿記事 by webmaster » 2008年3月31日(月) 17:01

 shigeさん、お返事が大変遅れまして申し訳ありません。
 既に遅いかもしれませんが、回答させて頂きます。

 全体的な考え方としては合っていると思います。かなりXSLTを使いこなされて
いると思います。
 内容を拝見しますと、entryに対するfor-eachが$attrib1_listのfor-eachの中
に入っており、処理の「現在位置」が、$attrib1_listの中に移ってしまっている
為に、「$attrib1_listの中にはentryという要素は無いよ」という状態になって
しまっているようです。

 $attrib1_listの中のentryのfor-eachを、"entry" ではなく "/entrylist/entry"
ようにルートからの絶対位置にして頂くとどうでしょうか。

 ひょっとしたらうまく行かないかもしれないので、その際にはまたご連絡頂ければ
と思います。

 私も「カテゴリ別に分類して表示する」というXSLTを作った事がありますが、
もっと複雑な方法を取っていました。これがうまくいくのであれば、こちらの方が
かなりシンプルかと思います。私も真似させて頂こうと思います。m(__)m

shige
パワーユーザー
記事: 40
登録日時: 2006年4月04日(火) 14:25

ご回答ありがとうございます。

投稿記事 by shige » 2008年4月01日(火) 12:51

いつもお世話になっております。shigeです。
ご回答いただきましてありがとうございます。

とりあえず、カテゴリ名をスキーマから取り出さずに、デザイン定義に直接カテゴリ名を表記することでお茶を濁しておりました。

今回教えていただいた方法で、ご指摘の通り内側のループを

コード: 全て選択

    <xsl:for-each select="/entrylist/entry">
	<xsl:if test="attrib1='$attrib1_id'">
	<li>
	<xsl:value-of select="company" disable-output-escaping="yes" />
	</li>
	</xsl:if>
	</xsl:for-each>
というように変更して試してみたのですが、出力結果は、

コード: 全て選択

<div class="bg">土木</div><ul /><div class="bg">医療</div><ul /><div class="bg">福祉</div><ul /><div class="bg">食品</div><ul /><div class="bg">情報産業</div><ul /><div class="bg">管理</div><ul /><div class="bg">文化</div><ul />
となり、残念ながらエントリーの内容をうまく展開する事が出来ないようです。

また、目的の表示とならない件とは関係ないと思いますが、<ul>〜</ul>タグが<ul />と1命令で閉じられているのも少々気になります。

とりあえず冒頭の方法でお茶を濁せておりますので(笑)急ぎませんが、何か良い方法がありましたらアドバイスをお願いできますと幸いです。

ありがとうございました。

webmaster
Site Admin
記事: 1451
登録日時: 2004年12月10日(金) 10:09

Re: ご回答ありがとうございます。

投稿記事 by webmaster » 2008年4月01日(火) 13:06

 shigeさんいつもありがとうございます。

コード: 全て選択

<xsl:if test="attrib1='$attrib1_id'">
 を、

コード: 全て選択

<xsl:if test="attrib1=$attrib1_id">
 のようにすると、どうなるでしょうか。
 前者のようにすると、「$atrib1_id」という文字がattrib1に入っているかどうか
を比較する式になってしまうように思います。

 うまくいかなかった場合、何度も申し訳ありませんがまたご連絡頂ければ
幸いです。

返信