- PR -

for-eachでのテーブル構築

投稿者投稿内容
babanabhuta
会議室デビュー日: 2006/10/27
投稿数: 3
投稿日時: 2006-10-27 01:45
初心者的な質問ですみません。

<?xml version="1.0" encoding="Shift_JIS" ?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="html" encoding="Shift_JIS" />
<xsl:template match="/">
<html>
<head>
<title><xsl:value-of select="books/@title" /></title>
<link rel="stylesheet" type="text/css" href="books.css" />
</head>
<h1><xsl:value-of select="books/@title" /></h1>
<table border="1">
<tr>
<th>a</th>
<th>b</th>
<th>c</th>
<th>d</th>
<th>e</th>
<th>f</th>
</tr>
<xsl:apply-templates select="books" />
</table>
<div><xsl:value-of select="books/owner" /></div>
</html>
</xsl:template>
<xsl:template match="books">
<xsl:for-each select="book">
<xsl:sort select="publish" data-type="text" order="ascending" />
<xsl:sort select="pDate" data-type="text" order="descending" />
<tr>
<td><xsl:value-of select="@isbn" /></td>
<td><xsl:value-of select="name" /></td>
<td><xsl:value-of select="author" /></td>
<td><xsl:value-of select="publish" /></td>
<td><xsl:value-of select="price" /></td>
<td><xsl:value-of select="pDate" /></td>
</tr>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>

以上のようなソースを作りまして、<html>タグの中に記載したtableの<th>の右側に<td>のセルとして<xsl:for-each>を出力させたいのですが、全てtableの下に連結されてしまいます。
これを右にtdのセルとして出力させるにはどうすればいいのでしょうか?
よろしくお願いします
想馬
大ベテラン
会議室デビュー日: 2003/05/29
投稿数: 245
お住まい・勤務地: 神奈川・東京
投稿日時: 2006-10-27 09:16
一応XMLも貼った方がいいと思いますよ。あと望んでいる出力の形がいまいち分かりません。HTML自体はbodyタグがないですね。
_________________
己への戒め

「活動的な馬鹿より恐ろしいものはない」 by ゲーテ
babanabhuta
会議室デビュー日: 2006/10/27
投稿数: 3
投稿日時: 2006-10-27 09:38
失礼いたしました。
具体的にどういうテーブルを作りたいのか、下のページに書いてみました。
http://www.laajawaab.or.tv/sample.html

xmlも書いたほうがいいでしょうか?
87
会議室デビュー日: 2005/06/17
投稿数: 13
投稿日時: 2006-10-27 10:05
はじめまして。

テーブルの一行は<tr>〜</tr>までなので、
<xsl:for-each>内に<th>の内容を記述しなけらば
意図されているようにはなりません。

1行目にa、2行目にb・・・としたいのならば、
position()を使うとよろしいかと。
かずくん
ぬし
会議室デビュー日: 2003/01/08
投稿数: 759
お住まい・勤務地: 太陽系第三惑星
投稿日時: 2006-10-27 10:08
まずは、手始めとして、提示されたXSLTから
コード:
 <tr>
<th>a</th>
<th>b</th>
<th>c</th>
<th>d</th>
<th>e</th>
<th>f</th>
</tr> 


を削除します。

次いで、xsl:for-eachの中のブロックを、
コード:
<tr>
<th>a</th>
<td><xsl:value-of select="@isbn" /></td>
<td><xsl:value-of select="name" /></td>
<td><xsl:value-of select="author" /></td>
<td><xsl:value-of select="publish" /></td>
<td><xsl:value-of select="price" /></td>
<td><xsl:value-of select="pDate" /></td>
</tr> 


と書き換えます。

これで、1列目がすべて「a」と出力されてはいるが、想定したレイアウトになったのではないでしょうか?

ついで、英字の整形。ここから先は思いつきなので、うまくいかないかもしれません。

先ほど書き換えた
コード:
<th>a</th>



コード:
<th><xsl:number count="book" format="a"/></th>


に変更します。
これで、目的としたHTMLが出力されたかと。

ここでひとつ疑問が。
books/bookのノード数はあらかじめ6個に固定しているのでしょうか?
いまのままだと、fを超えて、データの続く限り出力してしまいます。
想馬
大ベテラン
会議室デビュー日: 2003/05/29
投稿数: 245
お住まい・勤務地: 神奈川・東京
投稿日時: 2006-10-27 10:08
引用:

babanabhutaさんの書き込み (2006-10-27 09:38) より:
失礼いたしました。
具体的にどういうテーブルを作りたいのか、下のページに書いてみました。
http://www.laajawaab.or.tv/sample.html

xmlも書いたほうがいいでしょうか?



<s>tableタグの使い方を間違えています。thタグはテーブルヘッダですから一番上に表示されるのは当然です。</s>

サンプルの出力結果を見ましたが左側がアルファベットになっていますね。あまりXML/XSLは詳しくありませんが恐らく数字に変えた方が簡単だと思います(というかアルファベットの処理が思いつかない)。

勉強も兼ねて簡単なサンプルを書いてみました。お役に立てば幸いです。

コード:

book.xml

<?xml version="1.0" encoding="Shift_JIS"?>
<?xml-stylesheet href="table.xsl" type="text/xsl"?>
<books>
<book>
<title>美味しいご飯の作り方</title>
<price>1200円</price>
</book>
<book>
<title>美味しいお菓子の作り方</title>
<price>2200円</price>
</book>
</books>


コード:

table.xsl

<?xml version="1.0" encoding="Shift_JIS"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0">
<xsl:output method="html" encoding="Shift_JIS"
doctype-public="-//W3C//DTD XHTML 1.1//EN"
doctype-system="http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"/>

<xsl:template match="/">
<html>
<head>
<title>欲しい本一覧</title>
</head>
<body>
<table>
<tr>
<th>番号</th>
<th>タイトル</th>
<th>価格</th>
</tr>
<xsl:apply-templates select="books/book"/>
</table>
</body>
</html>
</xsl:template>

<xsl:template match="book">
<tr>
<td><xsl:number value="position()" format="a"/></td>
<td><xsl:value-of select="title" /></td>
<td><xsl:value-of select="price" /></td>
</tr>
</xsl:template>
</xsl:stylesheet>



# 追記
ちょうどこの件に関する記事や参考になるページを見つけました、アルファベットでも大丈夫みたいです。まだまだ勉強が足りない・・・orz

多階層のXML文書にナンバリング処理を行う
番号付け<xsl:number>のvalue値

# アルファベットで出力するように修正、勉強になりました
_________________
己への戒め

「活動的な馬鹿より恐ろしいものはない」 by ゲーテ

[ メッセージ編集済み 編集者: 想馬 編集日時 2006-10-27 10:14 ]

[ メッセージ編集済み 編集者: 想馬 編集日時 2006-10-27 10:19 ]

[ メッセージ編集済み 編集者: 想馬 編集日時 2006-10-27 10:49 ]
87
会議室デビュー日: 2005/06/17
投稿数: 13
投稿日時: 2006-10-27 10:35
<xsl:number>でアルファベット順に出来たのですね。
勉強になりました。

ところで、

引用:

想馬さんの書き込み (2006-10-27 10:08) より:
tableタグの使い方を間違えています。thタグはテーブルヘッダですから一番上に表示されるのは当然です。



以下のような使い方をよくするので反応してしまいました…。
概念(定義?)として誤っているという事でしょうか?

<table>
<tr>
<th>見出し1</th>
<td>データ1</td>
</tr>
<tr>
<th>見出し2</th>
<td>データ3</td>
</tr>
:
:
</table>
かずくん
ぬし
会議室デビュー日: 2003/01/08
投稿数: 759
お住まい・勤務地: 太陽系第三惑星
投稿日時: 2006-10-27 10:44
引用:

87さんの書き込み (2006-10-27 10:35) より:
以下のような使い方をよくするので反応してしまいました…。
概念(定義?)として誤っているという事でしょうか?

<table>
<tr>
<th>見出し1</th>
<td>データ1</td>
</tr>
<tr>
<th>見出し2</th>
<td>データ3</td>
</tr>
:
:
</table>



HTMLの仕様みても、thとtdを混在させちゃダメというのは見つけられませんでした。
てゆうか、
http://www.w3.org/TR/html4/struct/tables.html
引用:
コード:
<TABLE border="1"
          summary="This table gives some statistics about fruit
                   flies: average height and weight, and percentage
                   with red eyes (for both males and females).">
<CAPTION><EM>A test table with merged cells</EM></CAPTION>
<TR><TH rowspan="2"><TH colspan="2">Average
    <TH rowspan="2">Red<BR>eyes
<TR><TH>height<TH>weight
<TR><TH>Males<TD>1.9<TD>0.003<TD>40%
<TR><TH>Females<TD>1.7<TD>0.002<TD>43%
</TABLE>



ってゆう、サンプルあるし。

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