- - PR -
テーブル組みするXSLT
1
投稿者 | 投稿内容 | ||||||||
---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2006-03-01 18:26
下記のデータを、2行2列のテーブルとして、
ケース1 ケース2 ケース3 ケース4 のように横に2つずつ並べたいと思います。
奇数番を左、偶数番を右のつもりで、こんなふうに書いてみました。
これだと、市松模様のように互い違いに入ってしまいます。 うまくケース1とケース2を並べるにはどうしたらいいのでしょうか。 [ メッセージ編集済み 編集者: ane 編集日時 2006-03-01 18:28 ] | ||||||||
|
投稿日時: 2006-03-01 23:28
▲ 簡単な方法
XSLT2.0 を使います、メジャーな xsltプロセッサーは2.0の先行実装してます。 XSLT2.0の感覚 http://www.mothprog.com/prog/xslt2/xslt6.html xsl:for-each-group select="species" group-by="?????" など group- の指定法は複数あり。 XSLT2.0 仕様の最終投票は近いらしいです。 ▲ 勇者になる方法 XSLT1.0 でやりくりします。 1. sibling:: 軸を使い隣接兄弟をつかんで行く方法 2.for-each ではなく selectしたノードをvariable に受けてから node-set関数でバラして、case[n],case[n+1] と2個づつ取り出す。 node-set関数は1.0仕様に入ってはいないが、使うやり方はあるハズ。 など。 [ メッセージ編集済み 編集者: MMX 編集日時 2006-03-01 23:30 ] | ||||||||
|
投稿日時: 2006-03-02 09:03
ひとつの解法
<xsl:template match="data"> <table border="1"> <xsl:for-each select="case"> <xsl:variable name="p"><xsl:value-of select="position()"/></xsl:variable> <xsl:if test="$p mod 2 = 1"> <tr> <td> <xsl:value-of select="."/> </td> <td> <xsl:value-of select="../case[position()=$p+1]"/> </td> </tr> </xsl:if> </xsl:for-each> </table> </xsl:template> | ||||||||
|
投稿日時: 2006-03-02 10:02
<xsl:variable name="p"><xsl:value-of select="position()"/></xsl:variable> ↓ <xsl:variable name="p" select="position()"/> 短いほうが読みやすい、上は文字列で、下は数値。 XSLT自体が読みにくいので(有名)、ドーでもいいのですが <xsl:for-each select="case[position() mod 2 = 1]"><!-- 頭出し --> <tr> <td><xsl:value-of select="."/></td> <td><xsl:value-of select="following-sibling::case[1]"/></td> </tr> </xsl:for-each> | ||||||||
|
投稿日時: 2006-03-02 10:35
>未記入さま
>MMXさま ありがとうございます。 変数を使う方法は一度試してみたのですが、 <xsl:value-of select="../case[position()=$p+1]"/> のところをどうしていいのかわからずに断念していました。 MMXさまの最後のfollowing-siblingを使うものが、 今の私には一番理解しやすい方法でした。 本当にありがとうございました。 |
1