2

xml-fo を使用して PDF ドキュメントにテーブルを生成しています。
列の数は動的です。列は、テストに合格した場合にのみ表示されます。
テストでは、xml ノードを指す $var1、$var2 などの変数を使用しています。

私は次のようなものを持っています

 <xsl:element name="fo:table-row">
    <xsl:element name="fo:table-cell" use-attribute-sets="table-cell">
        <xsl:attribute name="number-columns-spanned"> **???** </xsl:element>
        <xsl:element name="fo:block">Text that spans over columns</xsl:element>
    </xsl:element>
 </xsl:element>
 <xsl:element name="fo:table-row" use-attribute-sets="headerRow"> 
    <xsl:element name="fo:table-cell" use-attribute-sets="table-cell">
       <xsl:element name="fo:block">some value here</xsl:element>
    </xsl:element>
    <xsl:if test="$var1">
       <xsl:element name="fo:table-cell" use-attribute-sets="table-cell">
          <xsl:element name="fo:block">maybe some value here 2</xsl:element>
       </xsl:element>
    </xsl:if>
    <xsl:if test="$var2">
       <xsl:element name="fo:table-cell" use-attribute-sets="table-cell">
          <xsl:element name="fo:block">maybe some value here 3</xsl:element>
       </xsl:element>
    </xsl:if>
    ...
</xsl:element>

列全体にまたがるように 1 行目を拡張しています。「number-columns-spanned」は変数であり、合格するテストの数によって異なります。
number-columns-spanned 属性を正しく定義するために、通過する条件の数を動的に抽出する簡単な方法はありますか?

4

1 に答える 1

3

次のような式を使用して、変数の内容をカウントできます。

count($var1 | $var2 | $var3 | ...)

これは、各変数がおそらく空のセットであると想定しています。代わりに変数が true/false 値である場合は、XSL で false が 0 で true が 1 であるという事実を利用できます (少なくとも私が使用しているインタープリターでは)。

$var1 + $var2 + $var3 + ...

値がノード セットではなく、ブール値でもない場合は、最初にそれらをブール値に変換します。

boolean($var1) + boolean($var2) + boolean($var3) + ...

それを処理する非常にエレガントな方法ではありませんが、機能します。

XPath 仕様 によると、ブール値は、数値にキャストするときに実際にこのように動作するはずです。知っておくと良いです!

于 2010-07-13T17:53:13.627 に答える