xml-fo pdf table: 'colspan', когда число столбцов является динамическим - PullRequest
2 голосов
/ 13 июля 2010

Я создаю таблицу в PDF-документе, используя xml-fo.
Количество столбцов является динамическим. Столбцы отображаются только при прохождении тестов.
В тестах я использую переменные типа $ var1, $ var2, ..., которые указывают на узлы xml.

У меня есть что-то вроде

 <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?

1 Ответ

3 голосов
/ 13 июля 2010

Вы можете подсчитать содержимое переменных с помощью выражения, подобного этому:

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

Это предполагает, что каждая из ваших переменных является, возможно, пустым набором. Если ваши переменные имеют значения true / false, тогда вы можете воспользоваться тем фактом, что false равно 0, а true равно 1 в XSL (по крайней мере, с помощью используемого мной интерпретатора):

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

Если значения не являются наборами узлов и не являются логическими значениями, сначала преобразуйте их в логические значения:

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

Не совсем элегантный способ справиться с этим, но он работает.

В соответствии со спецификацией XPath булевы действительно должны вести себя так, когда приводятся к числовым значениям. Полезно знать!

...