XSL-FO- 指定条件可见性

P.B*_*key 4 xslt xsl-fo apache-fop

我有一个 HTML 表格,它根据其内容而变化。1-3 列隐藏。1 列名称更改。一切看内容。

我正在创建此 HTML 表格的 PDF 版本。PDF 版本apache-FOPfop 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>
Run Code Online (Sandbox Code Playgroud)

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>
Run Code Online (Sandbox Code Playgroud)

这样做,我在创建表格时几乎没有灵活性。但是,这就是我所知道的一切。

P.B*_*key 5

经过大量修补后,结果证明我可以使用xsl:when和 变量添加/删除列。

首先创建一个变量

<xsl:variable name="SiteName" select="Procedure/SiteName" />
Run Code Online (Sandbox Code Playgroud)

然后有条件地创建表的 3 个元素(列定义、标题、正文)。从列定义开始...

          <xsl:choose>
            <xsl:when test="$SiteName = 'Site1'">
              <fo:table-column />//column 2
            </xsl:when>
          </xsl:choose>
Run Code Online (Sandbox Code Playgroud)

然后是标题

           <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>
Run Code Online (Sandbox Code Playgroud)

最后,身体

                <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>
Run Code Online (Sandbox Code Playgroud)