- PR -

tableを3段組みにしてsortをかけたい

1
投稿者投稿内容
fireworkss
会議室デビュー日: 2007/02/12
投稿数: 11
投稿日時: 2007-04-17 09:25
下記のxsltによってtableを3段組にしています。

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="&#8203;http://www.w3.org/1999/XSL/Transform">&#8203;
<xsl:template match="/">
<html>
<title>test</title>
<body>
<table border="1">
<xsl:apply-templates select="cate/tea/name[position() mod 3 = 1]"/>
</table>
</body>
</html>
</xsl:template>
<xsl:template match="cate/tea/name">
<tr>
<td><xsl:value-of select="."/></td>
<td><xsl:value-of select="following-sibling::name[1]"/></td>
<td><xsl:value-of select="following-sibling::name[2]"/></td>
</tr>
</xsl:template>
</xsl:stylesheet>

こんな感じの出力です。
<table>
<tr>
<td>あかぎ</td>
<td>さとみ</td>
<td>ゆめお</td>
</tr>
<tr>
<td>かさお</td>
<td>らの</td>
<td>でお</td>
</tr>
省略
</table>

xmlは下記です。
<cate>
<tea>
<name>あかぎ</name>
<name>さとみ</name>
<name>ゆめお</name>
<name>かさお</name>
<name>らの</name>
<name>でお</name>
<name>くる</name>
<name>もも</name>
<name>しょう</name>
<name>さめお</name>
<name>たさお</name>
<name>うらの</name>
<name>こでお</name>
<name>さくる</name>
<name>れもも</name>
<name>きょう</name>
</tea>
</cate>

この3段組みをしたまま、
nameを名前順にソートしたいのですが、
うまくいきません。
あかぎ、かさお、くる、といった左の列内だけで、
ソートされてしまい、次にそれぞれの後続の兄弟ノードが、
真ん中の列にでてしまいます。

ちゃんと、xmlデータ順(あかぎ、さとみ、ゆめお、かさお・・・)に3段組みを表現したいのですが、
無理なのでしょうか。

どなたかご協力お願いします。
かめたろ
ぬし
会議室デビュー日: 2003/03/20
投稿数: 255
投稿日時: 2007-04-18 10:52
どんな結果を求めているのかいまいち分かりませんでしたが、ソートした結果をテーブルに3列に出せばいいのでしょうかね?
やっつけで作ってみましたが、trタグの出し方がいまいちなのでもっとよいやり方があると思います。私が書いた程度のxsltなら、@ITのxsltの記事を読めば書けますよ。

コード:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<html>
<title>test</title>
<body>
<table border="1">
<!--<xsl:apply-templates select="cate/tea/name[position() mod 3 = 1]">-->
<xsl:apply-templates select="cate/tea/name">
<xsl:sort select="." data-type="text" order="ascending"/>
</xsl:apply-templates>
</table>
</body>
</html>
</xsl:template>
<xsl:template match="name">
<!--trを出力-->
<xsl:if test="position() mod 3 = 1">
<xsl:text disable-output-escaping="yes">&lt;tr&gt;</xsl:text>
</xsl:if>
<!--値を出力-->
<td><xsl:value-of select="."/></td>
<!--/trを出力-->
<xsl:if test="position() != last()">
<xsl:if test="position() mod 3 = 0">
<xsl:text disable-output-escaping="yes">&lt;/tr&gt;</xsl:text>
</xsl:if>
</xsl:if>
<xsl:if test="position() = last()">
<xsl:text disable-output-escaping="yes">&lt;/tr&gt;</xsl:text>
</xsl:if>
</xsl:template>
</xsl:stylesheet>



----編集
&lt;と&gt;がデコードして表示されちゃったので修正。&を全角にしました。

[ メッセージ編集済み 編集者: かめたろ 編集日時 2007-04-18 11:00 ]
fireworkss
会議室デビュー日: 2007/02/12
投稿数: 11
投稿日時: 2007-04-18 11:36
ありがとうございました!
考え方はわかりましたので、工夫してみます!
1

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