XSL-FO - Определение условной видимости - PullRequest
3 голосов
/ 27 сентября 2011

У меня есть таблица HTML, которая варьируется в зависимости от ее содержимого.1-3 столбца скрыть.Изменение названия 1 столбца.Все в зависимости от содержания.

Я создаю PDF-версию этой таблицы HTML.Версия PDF использует apache-FOP с fop v1.0.Вывод в формате PDF содержит 2 из вышеупомянутых таблиц на одной странице.Я не хочу создавать .xsl для каждой комбинации возможностей.Это много дублирования и обслуживания.

Я могу решить изменение имени столбца, просто передав имя столбца вместе с содержимым XML.Но условная видимость столбцов представляется гораздо более сложной задачей.

Как настроить условную видимость?Возможно ли это?

Я с трудом заставляю <fo:table-column visibility="collapse" /> работать.Данные по-прежнему отображаются с видимостью, скрытой или свернутой.display="none" выглядело многообещающе.Но API не отображает его как действительное свойство для столбца таблицы.

Если я не могу условно скрыть столбец, мне нужно создать 18 уникальных xsl файлов ...

В настоящее время мои таблицы очень простые.Я делаю

<fo:block font-size="10pt">
  <fo:table table-layout="fixed" width="100%" border-collapse="separate">
    <fo:table-column />
    <fo:table-column />
    <fo:table-column />
    <fo:table-column />
    <fo:table-column />
    <fo:table-column visibility="collapse" />
    <fo:table-column />
    <fo:table-column />
    <fo:table-column />
    <fo:table-column />
    <fo:table-header>
      <fo:table-cell border-width="0.2mm" border-style="solid">
        <fo:block>Header 1</fo:block>
      </fo:table-cell>
      //...9 other headers (these should show/hide as needed)
    </fo:table-header>
    <fo:table-body>
      <xsl:for-each select="Object/type/SomeItem/ProcedureItemCollection">
        <fo:table-row>
          <fo:table-cell border-width="0.2mm" border-style="solid" >
            <fo:block>
              <xsl:value-of select="content1"/>
            </fo:block>
          </fo:table-cell>
          //...9 other cells...
        </fo:table-row>
      </xsl:for-each>
    </fo:table-body>
  </fo:table>
</fo:block>

XML

<Procedure>
  <SiteName>Site1</SiteName>//If Site1, don't create column 2
                            //If Site2, don't create column 2,3,4
                            //If Site3, create all columns
   <itemtype1>
            <item><member1></member1><member2></member2></item>
            <item><member1></member1><member2></member2></item>
   </itemtype1>
   <itemtype2>
            <item><member1></member1><member2></member2></item>
            <item><member1></member1><member2></member2></item>
   </itemtype2>
</Procedure>

Делая это таким образом, у меня мало гибкости в создании таблицы.Но это все, что я умею делать.

1 Ответ

4 голосов
/ 28 сентября 2011

После долгих попыток выясняется, что я могу добавлять / удалять столбцы, используя xsl:when и переменную.

Сначала создайте переменную

<xsl:variable name="SiteName" select="Procedure/SiteName" />

Затем условно создайте 3элементы таблицы (определение столбца, заголовок, тело).Начиная с определения столбца ...

          <xsl:choose>
            <xsl:when test="$SiteName = 'Site1'">
              <fo:table-column />//column 2
            </xsl:when>
          </xsl:choose>

Затем заголовок

           <xsl:choose>
              <xsl:when test="$SiteName = 'Site1'">
                    <fo:table-cell border-width="0.2mm" border-style="solid">
                      <fo:block>Column2</fo:block>
                    </fo:table-cell>
              </xsl:when>
            </xsl:choose>

Наконец, тело

                <xsl:choose>                                           
                        <xsl:when test="$SiteName = 'Site1'">
                          <fo:table-cell border-width="0.2mm" border-style="solid" >
                            <fo:block>
                              <xsl:value-of select="column2value"/>
                            </fo:block>
                          </fo:table-cell>
                        </xsl:when>                          
                </xsl:choose>
...