- PR -

XSLTの再帰的処理における質問です

1
投稿者投稿内容
すみれ
会議室デビュー日: 2005/07/12
投稿数: 13
投稿日時: 2006-10-16 15:35
いつも大変お世話になっております。
この掲示板で勉強させていただいているすみれと申します。

下記のようなXMLをHTMLに変換させようとしています。
calsの記述が残ったXMLで、表の結合の処理が複雑になっています。
XSLTのcellwidthのテンプレートの処理がうまくいかず、その原因をつかめずにいます。
どなたかご意見をお聞かせいただけますでしょうか。
よろしくお願いいたします。

XML
コード:

<table>
<tgroup cols = "3" widths = "1.111in 2.222in 4.444in">
<tbody>
<row>
<entry namest = "2" nameend = "2">aaa</entry>    ←@
<entry colname = "3">bbb</entry>           ←A
</row>
<row>
<entry namest = "3" nameend = "3">ccc</entry>    ←B
</row>
</tbody>
</tgroup>
</table>



nameendは左端から数えたセルの位置で、
namestは結合されたセルの数を表しています。
colnameは結合されていない場合です。

@は、2つのセルが結合されたセルで、
Aは、結合されていないセル、
Bは、3つのセルが結合されたセルになります。

HTML
コード:

<table>
<tbody>
<tr>
<td width = 240 colspan="2">aaa</td>
<td width = 320>bbb</td>
</tr>
<tr>
<td width = 560 colspan="3">ccc</td>
</tr>
</tbody>
</table>


結合されたセルの幅を足して、width属性に表示させる。

XSLT
コード:

<xsl:template match ="table">
<table border="1">
<tbody>
<xsl:for-each select="tgroup//row">
<tr>
<xsl:for-each select="entry">
<td>
<xsl:choose>
<xsl:when test="@colname">
<xsl:call-template name="widthtemplate"/>
</xsl:when>
<xsl:value-of select="."/>
<xsl:otherwise>
<xsl:attribute name="width">
<xsl:call-template name="cellwidth">
<xsl:with-param name="takenum" select="@namest"/>
<xsl:with-param name="sum" select="0"/>
</xsl:call-template>
</xsl:attribute>
</xsl:otherwise>
</xsl:choose>
<xsl:if test="@namest">
<xsl:attribute name="colspan">
<xsl:value-of select="@namest"/>
</xsl:attribute>
</xsl:if>
<xsl:value-of select="."/>
</td>
</xsl:for-each>
</tr>
</xsl:for-each>
</tbody>
</table>
</xsl:template>

<!--cellwidthテンプレート--><!--このテンプレートがうまくいかない-->
<xsl:template name="cellwidth">
<xsl:param name="num"/>
<xsl:param name="sum"/>
<xsl:param name="takenum"/>
<xsl:variable name="w">
<xsl:call-template name="takeout">
<xsl:with-param name="str" select="ancestor::tgroup/@widths"/>
<xsl:with-param name="num" select="$num"/>
</xsl:call-template>
</xsl:variable>
<xsl:choose>
<xsl:when test="$takenum = 1">
<xsl:value-of select="$sum + $w"/>
</xsl:when>
<xsl:otherwise>
<xsl:call-template name="cellwidth">
<xsl:with-param name="num" select="@nameend - $takenum + 1"/>
<xsl:with-param name="sum" select="$sum + $w"/>
<xsl:with-param name="takenum" select="$takenum - 1"/>
</xsl:call-template>
</xsl:otherwise>
</xsl:choose>
</xsl:template>

<!--width属性をつくるテンプレート(@colnameがある場合)--><!--OK-->
<xsl:template name="widthtemplate">
<xsl:attribute name="width">
<xsl:call-template name="takeout">
<xsl:with-param name="str" select="ancestor::tgroup/@widths"/>
<xsl:with-param name="num" select="@colname"/>
</xsl:call-template>
</xsl:attribute>
</xsl:template>

<!--inで区切って*72、四捨五入--><!--OK-->
<xsl:template name="takeout">
<xsl:param name="str"/>
<xsl:param name="num"/>
<xsl:variable name="kugiri" select="'in'"/>
<xsl:variable name="num1" select="$num - 1"/>
<xsl:variable name="car" select="substring-before($str, $kugiri)"/>
<xsl:variable name="cdr" select="substring-after($str, $kugiri)"/>
<xsl:choose>
<xsl:when test="$num1 = 0">
<xsl:value-of select="floor($car *72)"/><!--実数計算後、表示-->
</xsl:when>
<xsl:otherwise>
<xsl:call-template name="takeout">
<xsl:with-param name="str" select="$cdr"/>
<xsl:with-param name="num" select="$num1"/>
</xsl:call-template>
</xsl:otherwise>
</xsl:choose>
</xsl:template>




[ メッセージ編集済み 編集者: すみれ 編集日時 2006-10-16 17:21 ]
MMX
ぬし
会議室デビュー日: 2001/10/26
投稿数: 861
投稿日時: 2006-10-16 16:03
再帰処理以前に
html として、width は指定の通りに 表示されないでしょう
どの ブラウザでも。
コード:
<table>・・・</table>


を html 拡張子でファイルにして、表示すれば わかります。
すみれ
会議室デビュー日: 2005/07/12
投稿数: 13
投稿日時: 2006-10-16 17:24
MMXさん、ご返答をありがとうございます。
恥ずかしいくらいに、HTMLの記述が間違っていました。
すみません。。
1

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