- PR -

XML文書をXSLTでHTMLへ変換

1
投稿者投稿内容
ショウ
会議室デビュー日: 2006/01/07
投稿数: 5
投稿日時: 2006-01-07 18:03
はじめまして、長文失礼します。
XML文書をXSLTを使用してHTMLに変換して居ります。
以下のXML文書のoption要素のcolname属性に
対応するbook要素の各属性値を、
option要素のorder属性の順番で
左から順に並べて表を作りたいと思って居ります。

<root>
<option order="1" colname="name" />
<option order="3" colname="price" />
<option order="2" colname="author" />
<book name="健康の極意" price="1500" author="中村" />
<book name="3分ダイエット" price="1300" author="鈴木" />
</root>

上記XMLから下記の表を作成したい。

name | author | price
健康の極意 | 中村 | 1500
3分ダイエット | 鈴木 | 1300

以下のXSLTで、ヘッダー行の作成までは出来たのですが、
データ行の作成に苦労して居ります。

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:template match="/">
<html>
<head>
<title>テスト</title>
</head>
<body>
<table border="1">
<tr>
<xsl:apply-templates select="root" />
</tr>
</table>
</body>
</html>
</xsl:template>

<xsl:template match="root">
<!--ヘッダ行の作成-->
<xsl:for-each select="option">
<!--order属性順に左から項目を並べるためのソート処理-->
<xsl:sort select="@order" data-type="number" order="ascending" />
<th>
<xsl:value-of select="@colname" />
</th>
</xsl:for-each>

<!--データ行の作成-->
<xsl:for-each select="book">
<tr>
<td>
<xsl:value-of select="@author" />
</td>
<td>
<xsl:value-of select="@price" />
</td>
<td>
<xsl:value-of select="@name" />
</td>
</tr>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>

データ行の作成部分に関して、
option要素のorder属性の値によって、
xsl:value-of要素のselect属性に
渡す値(@author、@price、@name)の順番を
動的に変える事が出来れば良いと思うのですが、
実現方法がわからず、困って居ります。
どなたか知恵を貸していただけないでしょうか?
XMLの表示にはIE6を使用して居ります。
MMX
ぬし
会議室デビュー日: 2001/10/26
投稿数: 861
投稿日時: 2006-01-08 12:12
<!-- [ヘッダ→明細]行の作成-->
●<xsl:variable name="boo" select="."/><!-- bookのカレントを握っておく -->

<xsl:for-each select="option">
<!--order属性順に左から項目を並べるためのソート処理-->
<xsl:sort select="@order" data-type="number" order="ascending" />
<td>
●<xsl:value-of select="$boo/@*[name() = current()/@colname]" />
</td>
</xsl:for-each>
では。同じソートの繰り返しは 最適化で除去されるかは不明。
ショウ
会議室デビュー日: 2006/01/07
投稿数: 5
投稿日時: 2006-01-11 10:40
MMX様
アドバイス下さり、誠にありがとう御座いました。
おかげさまで希望通りの変換が出来ました。
データ作成部を以下の様に変更しました。

<!--データ行の作成-->
<xsl:for-each select="book">
<xsl:variable name="boo" select="."/><!-- bookのカレントを握っておく -->
<tr>
<xsl:for-each select="../option">
<xsl:sort select="@order" data-type="number" order="ascending" />
<td>
<xsl:value-of select="$boo/@*[name() = current()/@colname]" />
</td>
</xsl:for-each>
</tr>
</xsl:for-each>
1

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