入力として XML を使用し、変換言語として xsl を使用して、複数の html テーブル ページを作成したいと考えています。これらのテーブルは、1 行であろうと 10 行であろうと、常に固定の高さを持つ必要があります。CSS(最小高さ)で動作させることができません。だから私は、xslが常に10行を出力し、10行未満の場合は空の行を追加するか、XMLに10行以上存在する場合は行を追加してテーブルのサイズを変更できるかどうか疑問に思っていました。
これを達成する方法はありますか?
入力として XML を使用し、変換言語として xsl を使用して、複数の html テーブル ページを作成したいと考えています。これらのテーブルは、1 行であろうと 10 行であろうと、常に固定の高さを持つ必要があります。CSS(最小高さ)で動作させることができません。だから私は、xslが常に10行を出力し、10行未満の場合は空の行を追加するか、XMLに10行以上存在する場合は行を追加してテーブルのサイズを変更できるかどうか疑問に思っていました。
これを達成する方法はありますか?
あなたは確かにそれを行うことができます。データが不足している場合に、最後の行 (またはおそらく唯一の行) をダミー行で埋める 10 行のテーブルにデータを分割する方法をお見せします。必要な場所に移動するのに役立つはずです(XML入力の例と必要なHTML出力がなければ、これは私ができる限りです)
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html" encoding="UTF-8"/>
<xsl:template match="/">
<xsl:apply-templates select="data/row[position() mod 10 = 1]" mode="newtable"/>
</xsl:template>
<xsl:template match="row" mode="newtable">
<table>
<xsl:apply-templates select="."/>
<xsl:apply-templates select="following-sibling::row[position() < 10]"/>
<xsl:call-template name="dummy-rows">
<xsl:with-param
name="how-many"
select="9 - count(following-sibling::row[position() < 10])"/>
</xsl:call-template>
</table>
</xsl:template>
<xsl:template match="row">
<tr><td><xsl:value-of select="."/></td></tr>
</xsl:template>
<xsl:template name="dummy-rows">
<xsl:param name="how-many" select="0"/>
<xsl:if test="$how-many > 0">
<tr><td>dummy</td></tr>
<xsl:call-template name="dummy-rows">
<xsl:with-param name="how-many" select="$how-many - 1"/>
</xsl:call-template>
</xsl:if>
</xsl:template>
</xsl:stylesheet>
アイデアはtable
、10 の各セットの「最初の」ノードから開始することです。それが[position() mod 10 = 1]
述語です。テーブルの開始点を把握したら、テーブル境界を作成し、そのノードを通常モードで再度処理します。次に、それに続く次の 9 つのデータ行を取得します。最後に、必要な数のダミー ノードを追加して、各テーブルの合計が 10 であることを確認します。dummy-rows
テンプレートは再帰です。したがって、ここでは 2 つの手法があります。セットを a で分割し、position() mod
a を使用しrecursion
て反復を実装します。
UPDATEテーブルに少なくとも10行あることを確認するだけでよい場合は、分割ロジックは必要ありません。
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html" encoding="UTF-8"/>
<xsl:template match="/">
<table>
<xsl:apply-templates select="data/row"/>
<xsl:call-template name="dummy-rows">
<xsl:with-param
name="how-many"
select="10 - count(data/row)"/>
</xsl:call-template>
</table>
</xsl:template>
<xsl:template match="row">
<tr><td><xsl:value-of select="."/></td></tr>
</xsl:template>
<xsl:template name="dummy-rows">
<xsl:param name="how-many" select="0"/>
<xsl:if test="$how-many > 0">
<tr><td>dummy</td></tr>
<xsl:call-template name="dummy-rows">
<xsl:with-param name="how-many" select="$how-many - 1"/>
</xsl:call-template>
</xsl:if>
</xsl:template>
</xsl:stylesheet>
次のような入力でこれを試すことができます。
<data>
<row>1</row>
<row>1</row>
<row>3</row>
</data>
または次のような入力:
<data>
<row>1</row>
<row>2</row>
<row>3</row>
<row>4</row>
<row>5</row>
<row>6</row>
<row>7</row>
<row>8</row>
<row>9</row>
<row>10</row>
<row>11</row>
<row>12</row>
</data>
どちらの場合も、結果は予想どおりでした。それを試してみてください。ここから取れるはずです。