ページ 11

[XSLT] 一行目だけ表示を変えたい

Posted: 2007年10月14日(日) 16:07
by blue
 一覧表示をテーブルに組み込み表示しています。埋め込みタグで以下のように、予め絞込みを行なっています。

コード: 全て選択

<cmsd:entrylist name="person_data" design="person">
  <cmsd:group key="area" />
</cmsd:entrylist>
 デザイン側で、リスト項目にデータのある/なしで振り分け、リスト項目にデータのあるエントリが無い場合は、
テーブル自体を表示しない、というところまで出来ています。
 リスト項目にデータのあるエントリがある場合、なのですが、一行目の前にだけ、テーブルヘッド(<th>)
を表示させたい、ということで、

コード: 全て選択

<xsl:template match="/entrylist ">
<table>
<xsl:for-each select="entry">
<xsl:if test="not(person='')">
   <xsl:if test="position()=1"> <!-- ←ここが問題! -->
<tr><th>名前</th><th>内容</th></tr>
   </xsl:if>
<tr>
      <td><xsl:value-of select="namae" /></td>
      <td>
             <xsl:for-each select="person/listitem">
                  <xsl:value-of select="naiyo" /><br />
             </xsl:for-each>
      </td>
</tr>
</xsl:if>
</xsl:for-each>
</table>
</xsl:template>
これで良いのですが、position()というのは振り分け(絞込み)前の全エントリを対象に順番を付けてしまうため、
一番目のエントリがリスティングされなかった場合(リスト項目データが無い場合)は、
テーブルヘッドを表示してくれなくなってしまいます。
 で、条件で抽出したリストに改めて連番を振ってくれる方法があればと思うのですが、見つけることができません。
 xsl:numberは、ソート処理後に連番を振り直してくれますが、xsl:ifの後には効かないようですし。
 もしこれがダメなら、データのある/なしで別途グループキーで括ってやるしかないと思いますが、
データ項目を1つ増やす前に最後の悪あがきをしているような状況です。
 みなさまのお知恵をお貸しくださいませ。<(_ _)>

 質問フォーラムかとも思いましたが、CMSDesignerと直接関係する内容でもないかと思い、こちらを選びました。
 そぐわないようでしたら移動をお願いいたします。

Re: [XSLT] 一行目だけ表示を変えたい

Posted: 2007年10月15日(月) 16:16
by webmaster
 blueさん、ご質問ありがとうございます。

 内容を詳しく見ていないのではずしているかもしれませんが、

<for-each select="entry">

 の部分を、

<for-each select="entry[not person='']">

 と変えるとどうでしょうか。
 select属性の中で、要素名の後に[]を使って条件式を加えることで、その要素を
さらに絞り込むことが可能です。

 一度お試しください。

Posted: 2007年10月15日(月) 18:10
by blue
 お忙しいところ、早速ありがとうございます。
 <xsl:for-each〜ではなく、<for-each〜 なのですね?
<xsl:for-each select="entry[not person='']">
とするとエラーになり、
<for-each select="entry[not person='']">
ではエラーは出ませんでした。
 ですが、結果以下のようにコードを書き換えたところ、

コード: 全て選択

<xsl:template match="/entrylist ">
<table>
<for-each select="entry[not person='']">
   <xsl:if test="position()=1">
<tr><th>名前</th><th>内容</th></tr>
   </xsl:if>
<tr>
      <td><xsl:value-of select="position()" /> <xsl:value-of select="namae" /></td>
      <td>
             <xsl:for-each select="person/listitem">
                  <xsl:value-of select="naiyo" /><br />
             </xsl:for-each>
      </td>
</tr>
</for-each>
</table>
</xsl:template>
 テーブルヘッドは表示されるようになりましたが、データ行は1行しか表示されず、
position()の値は1と表示されますが、他のデータ(namaeやnaiyo)は空欄になってしまいました。
 素朴な疑問ですが、
 <xsl:for-each〜 と <for-each〜 では、どう違うのでしょうか。
 xsl ではない for-each をこの場で使うのは、どういう意味なのかなぁと。
select属性の中で、要素名の後に[]を使って条件式を加えることで、その要素を
さらに絞り込むことが可能です。
 またまた良いことを伺いました。ありがとうございます。

Posted: 2007年10月16日(火) 10:00
by webmaster
 blueさん、大変申し訳ありません、

<for-each〜

 ではなく、

<xsl:for-each〜

 の間違いでした。m(__;)m

 xsl:をつけない場合、単に出力データとして処理されてしまう為、HTML上に
<for-each〜 がそのまま出てしまうかと思います。
 大変失礼致しました。

Posted: 2007年10月16日(火) 15:02
by blue
 結論から申しあげると、巧く行きました。 :D
<xsl:for-each select="entry[not person='']" >
ではエラーが出ていたのですが、試しに
<xsl:for-each select="entry[person='']" >
としたところ、逆のエントリが並び、連番もきちんと振り直されてくれたので、これは not の記述が違っただけだろうと思い、
<xsl:for-each select="entry[not(person='')]" >
にしたところ、期待どおりの出力を得ました。

 ちなみに、
webmaster さんが書きました: xsl:をつけない場合、単に出力データとして処理されてしまう為、HTML上に
<for-each〜 がそのまま出てしまうかと思います。
ということはありませんでした。データが表示されないため、どんな処理がされていたのかは分かりませんが。
 いつも有用なヒントを下さり、ありがとうございます。<(_ _)>

Posted: 2007年10月16日(火) 15:06
by webmaster
 blueさん、ご報告ありがとうございます。
 「not person=''」ではなく「not(person='')」だったんですね。
 毎度間違ったアドバイスにも関わらず機転の効く対応、大変助かります。

 また何かありましたらよろしくお願い致します。