webmasterです。bcacsatoさん、いつもご質問ありがとうございます。また、回答が遅くなり申し訳ありません。
ご質問の件ですが、確かにこれはかなり複雑な部類のケースに入るかと思います。
XSLのいくつかの機能を組み合わせて、以下のように実現することが可能です。(動作チェックは行っておりませんので、ミスがありましたら申し訳ありません)
コード: 全て選択
<!-- エントリ一覧のテンプレート開始 -->
<xsl:template match="/entrylist">
<!-- URLパラメータで指定された"shopkind"の絞込み値を取得し、$shopkindという変数に格納する -->
<xsl:variable name="shopkind" select="group[@key='shopkind']/@value" />
<!-- URLパラメータで指定された"review"の絞込み値を取得し、$reviewという変数に格納する -->
<xsl:variable name="review" select="group[@key='review']/@value" />
<!-- ナビゲーションの表示 -->
<ul id="***">
<li>中華
<ul>
<li><xsl:if test="($shopkind = 'chinese') and ($review = '3')"><xsl:attribute name="class">active</xsl:attribute></xsl:if>★★★</li>
<li><xsl:if test="($shopkind = 'chinese') and ($review = '2')"><xsl:attribute name="class">active</xsl:attribute></xsl:if>★★</li>
<li><xsl:if test="($shopkind = 'chinese') and ($review = '1')"><xsl:attribute name="class">active</xsl:attribute></xsl:if>★</li>
</ul>
</li>
<li>和食
<ul>
<li><xsl:if test="($shopkind = 'japanese') and ($review = '3')"><xsl:attribute name="class">active</xsl:attribute></xsl:if>★★★</li>
<li><xsl:if test="($shopkind = 'japanese') and ($review = '2')"><xsl:attribute name="class">active</xsl:attribute></xsl:if>★★</li>
<li><xsl:if test="($shopkind = 'japanese') and ($review = '1')"><xsl:attribute name="class">active</xsl:attribute></xsl:if>★</li>
</ul>
</li>
各々の説明をさせて頂きます。非常にややこしいので、よくわからなければ、分かる範囲でそのままコピーしてお使いください。
まず、xsl:variableというタグですが、これはselect属性に指定した内容を、name属性に指定した名前の「変数」に格納し、他の場所で使えるようにするためのものです。
ここで、「group[@key='shopkind']/@value」というパスをselectに指定していますが、このパスは、「複数あるgroup要素(絞込み条件を指定した数だけこのgroup要素が存在します)のうち、keyが'shopkind'のものだけ抜き出し、そのgroup要素のvalue属性の値を選択せよ」というものになります。今回ですと、これでshopkindの絞込み条件を取得できます。このパスによって選択された絞込み条件を、「shopkind」という名前の変数に格納しています。変数名が絞り込み条件と同じになっているのは、単にわかりやすさの為で、ここは別の名前になっていても構いません。この「shopkind」という変数には、このデザイン定義の任意の場所で「$shopkind」と、先頭にドルマークをつけてアクセスすることができるようになります。
ともかくも、「$shopkind」という名前で、shopkindの絞込み条件を取得できるようになりました。
同じ方法で、「group[@key='review']/@value」というパスを使って「keyが'review'」の絞込み条件の値(@value)を選択し、$reviewという変数に格納しています。
そしてその下で、ナビゲーションの表示を行っています。
ここでは、それぞれのli要素について、たとえば「中華の★★★」を出力するli要素の中で、「もし、shopkindが'chinese'で、reviewが'3'なら」という条件分岐処理(xsl:if)を入れています。そして、「もしそうなら、li要素のclass属性に'active'を出力せよ」という命令を入れています。これがxsl:attribute要素です。
xsl:attribute要素は、直前の親要素に対して、任意の属性値を追加します。例えば次のように書くことができます。
コード: 全て選択
<a>
<xsl:attribute name="href">http://cms.al-design.jp</xsl:attribute>CMS Designer
</a>
上記のように書くと、
コード: 全て選択
<a href="http://cms.al-design.jp">CMS Designer</a>
と出力されます。もちろん通常はxsl:ifと組み合わせて、ある条件のときに属性値を追加したりします。
以上のような方法で、今回のご要望は実現できるかと思います。
ところで今回、$shopkindと$reviewを、直接id名やclass名として出力させる、という方法も、やり方によっては有効かと思いますが、これは避けてください。
コード: 全て選択
<li class="concat($shopkind, '-', $review)">★★★<li> <!-- ※この内容にあまり意味はありませんが… -->
concat関数は、それぞれの引数に指定された文字列を全部連結して1つの文字列として出力します。この場合だと、'chinese-3'のような文字列を作ってclass名として出力できます。
しかしこうすると、非常に危険なセキュリティホールになります。$shopkindや$reviewは、URLパラメータとして任意の値を指定できますから、ページ中に攻撃者が任意の文字列を表示できることになってしまいます。絞込み条件を使う場合には、URLパラメータとして渡された内容を直接出力しないよう、十分ご注意ください。
以上、大変長く複雑で申し訳ありません。ご不明な点などありましたらなんなりとご質問ください。