xsl -xml fo file - ввод данных таблицы в xml - PullRequest
0 голосов
/ 13 апреля 2011

У меня есть файлы xsl-xml, которые я превращаю в файл fop (используя фабрику FOP, javax.xml.transform.TransformerFactory), так что в конце концов я могу превратить его в PDF.До сих пор мне приходилось вводить только простые данные, поэтому в xsl я писал бы что-то вроде:

<xsl:template match="p">
    <fo:block>
        <xsl:apply-templates/>
    </fo:block>
</xsl:template>
<xsl:template match="center">
    <fo:block alignment-adjust="middle">
        <xsl:apply-templates/>
    </fo:block>
</xsl:template>
<xsl:template match="b">
    <fo:inline font-weight="bold">
        <xsl:apply-templates/>
    </fo:inline>
</xsl:template>

и т. Д.
И когда я преобразовывал их в файл fop, я получал:

<fo:block text-align="center" font-weight="bold" 
          text-decoration="underline" 
          padding-after="10">Sales Contract for <fo:inline font-weight="bold"
          color="red">Mobile  100</fo:inline>
</fo:block>

и т.д ...

Теперь у меня возникла ситуация, когда мне нужно отобразить таблицу с данными.Как определить шаблон таблицы в XML и что мне нужно добавить в XML?

1 Ответ

0 голосов
/ 16 мая 2011

Я не понимаю, что вы хотите ... но в каждом случае я пишу пример таблицы. Предположим, у вас есть таблица в следующем формате, где тег «строка» представляет строки таблицы, а тег «запись» столбцы:

  <table ENABLE="true" id="" title="">
    <tgroup ENABLE="true" cols="">
      <tbody ENABLE="true">
        <row ENABLE="true">
          <entry ENABLE="true" align="0 left">
            <text ENABLE="true">
              <DATA ENC="enc" LABEL="label">First row, first column (entry)</DATA>
            </text>
          </entry>
          <entry ENABLE="true" align="0 left">
            <text ENABLE="true">
              <DATA ENC="enc" LABEL="label">First row, second column (entry)</DATA>
            </text>
          </entry>
        </row>
        <row ENABLE="true">
          <entry ENABLE="true" align="0 left">
            <text ENABLE="true">
              <DATA ENC="enc" LABEL="label">Second row, first column (entry)</DATA>
            </text>
          </entry>
          <entry ENABLE="true" align="0 left">
            <text ENABLE="true">
              <DATA ENC="enc" LABEL="label">Second row, second column (entry)</DATA>
            </text>
          </entry>
        </row>
      </tbody>
    </tgroup>
  </table> 

xsl-fo может быть:

    <xsl:template match="table">
        <fo:block>
            <fo:inline font-size="10pt" font-weight="bold"  clear="both" float="right">
                <xsl:text>Table&#x20;</xsl:text><xsl:if test="@id"><xsl:apply-templates select="@id"/></xsl:if><xsl:if test="@title"><xsl:text>&#x20;</xsl:text><xsl:apply-templates select="@title"/></xsl:if>
            </fo:inline>
        </fo:block>
        <xsl:if test="descendant::*[self::row]">
          <fo:table margin-top="0.2in" border-top-color="#a0c0ff" border-top-width="0.01042in" border-bottom-style="solid" border-bottom-color="#a0c0ff" border-bottom-width="0.01042in" border-left-style="solid" border-left-color="#a0c0ff" border-left-width="0.01042in" border-right-style="solid" border-right-color="#a0c0ff" border-right-width="0.01042in" border-collapse="separate" background-color="#e9e9ff" color="black" display-align="center" text-align="left">
                <xsl:apply-templates select="child::*[self::thead or self::tbody or tfoot]" mode="calculate_columns"/>              
                    <fo:table-body>
                                <xsl:apply-templates/>
                      </fo:table-body>
                     </fo:table>
                    <fo:block>
                        <fo:leader leader-pattern="space"/>
                    </fo:block>
        </xsl:if>
    </xsl:template>         

    <xsl:template match="row" mode="calculate_columns">
          <xsl:variable name="columns" select="count(entry)"/>
          <xsl:variable name="table-width" select="ancestor::table[@width]"/>
          <xsl:param name="maxwidth" select="7.30000"/>
          <xsl:variable name="column-width">
            <xsl:value-of select="concat($table-width div $columns, 'cm')"/>
          </xsl:variable>
            <xsl:for-each select="entry">
                <xsl:variable name="column-number">
                  <xsl:number level="multiple" count="entry" format="1" />
                </xsl:variable>
                <fo:table-column column-number="{$column-number}"  column-width="{$column-width}"/>
            </xsl:for-each>
    </xsl:template>

    <xsl:template match="row">
      <fo:table-row>
        <xsl:apply-templates/>
      </fo:table-row>
    </xsl:template>

    <xsl:template match="entry">
      <fo:table-cell border-top-style="solid" border-top-color="#a0c0ff" border-top-width="0.01042in" border-bottom-style="solid" border-bottom-color="#a0c0ff" border-bottom-width="0.01042in" border-left-style="solid" border-left-color="#a0c0ff" border-left-width="0.01042in" border-right-style="solid" border-right-color="#a0c0ff" border-right-width="0.01042in">
        <fo:block padding-top="1pt" padding-bottom="1pt">
        <fo:inline>
          <xsl:apply-templates/>
         </fo:inline>
        </fo:block>
      </fo:table-cell>
    </xsl:template>
...