グループ絞込み条件の表示を入れ子にして使いたい

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

グループ絞込み条件の表示を入れ子にして使いたい

投稿記事 by bcacsato » 2012年9月12日(水) 06:29

下記トピックのように、大カテゴリ、小カテゴリの複数の条件により、エントリを絞り込み表示させました。
http://cms.al-design.jp/phpbb/viewtopic ... 5139#p5139

そこで、絞り込み条件を表示するため、下記の通り記述しました。

コード: 全て選択

<!-- カテゴリ -->
<xsl:for-each select="group">
	<xsl:if test="@key='category'">
		<xsl:if test="@value='1'">製品A
			<!-- サブカテゴリ -->
			<xsl:for-each select="group">
				<xsl:if test="@key='subcategory'">
					<xsl:if test="@value='1'">タイプ1</xsl:if>
					<xsl:if test="@value='2'">タイプ2</xsl:if>
					<xsl:if test="@value='3'">タイプ3</xsl:if>
					<xsl:if test="@value='4'">タイプ4</xsl:if>
				</xsl:if> 
			</xsl:for-each>
			<!-- /サブカテゴリ -->
		</xsl:if>
		<xsl:if test="@value='2'">製品B</xsl:if>
		<xsl:if test="@value='3'">製品C</xsl:if>
	</xsl:if> 
</xsl:for-each>
<!-- /カテゴリ -->
しかし、大カテゴリは表示されるものの、小カテゴリが表示されません。

入れ子にしてるのが悪いのかと思い、試しに下記の通り記述したところ、
大カテゴリ、小カテゴリとも表示されるようになりました。

コード: 全て選択

<!-- カテゴリ -->
<xsl:for-each select="group">
	<xsl:if test="@key='category'">
		<xsl:if test="@value='1'">製品A</xsl:if>
		<xsl:if test="@value='2'">製品B</xsl:if>
		<xsl:if test="@value='3'">製品C</xsl:if>
	</xsl:if> 
</xsl:for-each>
<!-- /カテゴリ -->
<!-- サブカテゴリ -->
<xsl:for-each select="group">
    <xsl:if test="@key='subcategory'">
        <xsl:if test="@value='1'">タイプ1</xsl:if>
        <xsl:if test="@value='2'">タイプ2</xsl:if>
        <xsl:if test="@value='3'">タイプ3</xsl:if>
        <xsl:if test="@value='4'">タイプ4</xsl:if>
    </xsl:if> 
</xsl:for-each>
<!-- /サブカテゴリ -->
できれば前述のように入れ子にして使いたいのですが、
絞り込み条件の表示は、入れ子にして使うことはできないのでしょうか?

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

Re: グループ絞込み条件の表示を入れ子にして使いたい

投稿記事 by webmaster » 2012年9月12日(水) 18:29

bcacsatoさん、いつもご質問ありがとうございます。

複数のカテゴリを「入れ子」構造にして使うケースについて、ドキュメント側で考慮しておらず、ご不便をおかけしております…。m(__)m

解決方法から先に書きますと、次のように書くことが可能です。(細部は適当に置き換えてください)
尚、この場合、<xsl:for-each select="group">要素は不要になります。
<!-- カテゴリ -->
<xsl:if test="group[@key='category']/@value='1'">製品A
<!-- サブカテゴリ -->
<xsl:if test="group[@key='subcategory']/@value='1'">タイプ1</xsl:if>
<xsl:if test="group[@key='subcategory']/@value='2'">タイプ2</xsl:if>
<xsl:if test="group[@key='subcategory']/@value='3'">タイプ3</xsl:if>
<xsl:if test="group[@key='subcategory']/@value='4'">タイプ4</xsl:if>
</xsl:if>
<xsl:if test="group[@key='category']/@value='2'">製品B
<!-- サブカテゴリ -->
<xsl:if test="group[@key='subcategory']/@value='1'">タイプ1</xsl:if>
<xsl:if test="group[@key='subcategory']/@value='2'">タイプ2</xsl:if>
<xsl:if test="group[@key='subcategory']/@value='3'">タイプ3</xsl:if>
<xsl:if test="group[@key='subcategory']/@value='4'">タイプ4</xsl:if>
</xsl:if>
つまり、ifのtest属性に、「group[@key='キー名']/@value='値'」と書くことで、各グループ絞込み条件を比較することができます。
考え方としては、「xsl:for-each select="group"」によって、1つ1つのグループ絞込み条件について順番に処理するのではなく、いきなり「group[@key='キー名']」で個々の条件へアクセスしてしまう、という考え方です。

ドキュメントにこの方法が記載されていないのは、極力XSLの記述内容をシンプルにしたかった為ですが、「複数のグループを入れ子にして使う」という用途について考慮されておりませんでした。

この方法で一度お試し頂き、うまくいかない、又は良く分からない、という場合、大変申し訳ないのですが、再度ご連絡頂ければ幸いです。

尚、この記述方法ですと、<xsl:template match="entrylist"> から <for-each select="entry">までの間でしかグループ絞込み条件へアクセスできませんが、
<xsl:if test="//group[@key='subcategory']/@value='1'">
のように、「group」の先頭に「//」をつけると、デザイン定義全体のいかなる場所からでもグループ絞込み条件へアクセスすることができるようになります。
このあたりはXSLの仕様に踏み込むことになるので、説明を省かせて頂きます。もしご興味ありましたら説明しますので、ご連絡ください。

bcacsato
パワーユーザー
記事: 233
登録日時: 2005年11月27日(日) 14:05

Re: グループ絞込み条件の表示を入れ子にして使いたい

投稿記事 by bcacsato » 2012年9月14日(金) 05:04

webmaster さま
ご回答ありがとうございます。おかげさまで、希望通りの表示となりました!
このようなシンプルな記述方法があったのですね。かなりソースがすっきりしました。

返信