- PR -

テーブル組みするXSLT

1
投稿者投稿内容
ane
会議室デビュー日: 2006/02/24
投稿数: 6
投稿日時: 2006-03-01 18:26
下記のデータを、2行2列のテーブルとして、
ケース1 ケース2
ケース3 ケース4
のように横に2つずつ並べたいと思います。
コード:

<data>
<case>ケース1</case>
<case>ケース2</case>
<case>ケース3</case>
<case>ケース4</case>
<case>ケース5</case>
</data>



奇数番を左、偶数番を右のつもりで、こんなふうに書いてみました。
コード:

<xsl:template match="/">
<html>
<body>
<xsl:apply-templates select="data" />
</body>
</html>
</xsl:template>

<xsl:template match="data">
<table border="1">
<xsl:for-each select="case">
<tr>
<td>
<xsl:if test="position() mod 2 = 1">
<xsl:value-of select="."/>
</xsl:if>
</td>
<td>
<xsl:if test="position() mod 2 = 0">
<xsl:value-of select="."/>
</xsl:if>
</td>
</tr>
</xsl:for-each>
</table>
</xsl:template>



これだと、市松模様のように互い違いに入ってしまいます。
うまくケース1とケース2を並べるにはどうしたらいいのでしょうか。

[ メッセージ編集済み 編集者: ane 編集日時 2006-03-01 18:28 ]
MMX
ぬし
会議室デビュー日: 2001/10/26
投稿数: 861
投稿日時: 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 ]
未記入
常連さん
会議室デビュー日: 2005/07/04
投稿数: 31
投稿日時: 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>
MMX
ぬし
会議室デビュー日: 2001/10/26
投稿数: 861
投稿日時: 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>
ane
会議室デビュー日: 2006/02/24
投稿数: 6
投稿日時: 2006-03-02 10:35
>未記入さま
>MMXさま

ありがとうございます。
変数を使う方法は一度試してみたのですが、
<xsl:value-of select="../case[position()=$p+1]"/>
のところをどうしていいのかわからずに断念していました。

MMXさまの最後のfollowing-siblingを使うものが、
今の私には一番理解しやすい方法でした。

本当にありがとうございました。
1

スキルアップ/キャリアアップ(JOB@IT)