2

こんばんは、アドバイスください。アイテムのリストがあります:

<List>
  <Item>
    <Description>Item 1</Description>
    <Code>0001</Code>
  </Item>
  <Item>
    <Description>Item 2</Description>
    <Code>0002</Code>
  </Item>
  <Item>
    <Description>Item 3</Description>
    <Code>0003</Code>
  </Item>
  <Item>
    <Description>Item 4</Description>
    <Code>0004</Code>
  </Item>
</List>

次のような項目を含む 3 列の表を印刷したいと思います。

| Column 1 | Column 2 | Column 3 |
==================================
| Item 1   | Item 2   | Item 3   |
----------------------------------
| Item 4   |          |          |
----------------------------------

以下のコードは、各アイテムのテーブル セルをレンダリングします。2 行目の列 2 と 3 のセルは表示されません。

<fo:table>
  <fo:table-column width="82mm"/>
  <fo:table-column width="82mm"/>
  <fo:table-column width="82mm"/>
  <fo:table-body>
    <xsl:for-each select="/List/Item[position() mod 3 = 1]">
      <fo:table-row><xsl:apply-templates select=". | following-sibling::*[3 > position()]"/></fo:table-row>
    </xsl:for-each>
  </fo:table-body>
</fo:table>

<xsl:template match="Item">
  <fo:table-cell><fo:block><xsl:value-of select="Description"/></fo:block></fo:table-cell>
</xsl:template>

テーブルは次のように出力されます。

| Column 1 | Column 2 | Column 3 |
==================================
| Item 1   | Item 2   | Item 3   |
----------------------------------
| Item 4   |
------------

テーブルがいっぱいに見えるように、空のテーブルセルでもレンダリングするエレガントな方法はありますか? FOP 0.95、xsl バージョン 1.0 を使用する必要があります。

前もって感謝します

ヴォイテック

4

1 に答える 1

1

これにより、可能な解決策のアイデアが得られることを願っています:

この単純な XML 文書を考えてみましょう:

<nums>
  <num>01</num>
  <num>02</num>
  <num>03</num>
  <num>04</num>
  <num>05</num>
  <num>06</num>
  <num>07</num>
  <num>08</num>
  <num>09</num>
  <num>10</num>
</nums>

次に、この変換

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:fo="http://www.w3.org/1999/XSL/Format">
    <xsl:output omit-xml-declaration="yes" indent="yes"/>

    <xsl:template match="/*">
        <fo:table>
            <fo:table-column width="82mm"/>
            <fo:table-column width="82mm"/>
            <fo:table-column width="82mm"/>
            <fo:table-body>
               <xsl:for-each select="*[position() mod 3 = 1]">
                 <fo:table-row>
                   <xsl:apply-templates select=
                                  ". | following-sibling::*[3 > position()]"/>

                        <xsl:variable name="vPos" select="position()"/>
                        <xsl:variable name="vUnfilled"
                             select=" 2 - count(following-sibling::*)"/>
                        <xsl:if test="position() = last()">
                         <xsl:for-each select=
                                   "../*[not(position() > $vUnfilled)]">
                            <fo:table-cell>
                                <fo:block>
                                    <xsl:value-of select="' '"/>
                                </fo:block>
                            </fo:table-cell>
                         </xsl:for-each>
                        </xsl:if>
                    </fo:table-row>
                </xsl:for-each>
            </fo:table-body>
        </fo:table>
    </xsl:template>

    <xsl:template match="num">
        <fo:table-cell>
            <fo:block>
                <xsl:value-of select="."/>
            </fo:block>
        </fo:table-cell>
    </xsl:template>
</xsl:stylesheet>

上記の XML ドキュメントに適用すると、各行に必要な全数のセルを含むテーブルが生成されます

<fo:table xmlns:fo="http://www.w3.org/1999/XSL/Format">
   <fo:table-column width="82mm"/>
   <fo:table-column width="82mm"/>
   <fo:table-column width="82mm"/>
   <fo:table-body>
      <fo:table-row>
         <fo:table-cell>
            <fo:block>01</fo:block>
         </fo:table-cell>
         <fo:table-cell>
            <fo:block>02</fo:block>
         </fo:table-cell>
         <fo:table-cell>
            <fo:block>03</fo:block>
         </fo:table-cell>
      </fo:table-row>
      <fo:table-row>
         <fo:table-cell>
            <fo:block>04</fo:block>
         </fo:table-cell>
         <fo:table-cell>
            <fo:block>05</fo:block>
         </fo:table-cell>
         <fo:table-cell>
            <fo:block>06</fo:block>
         </fo:table-cell>
      </fo:table-row>
      <fo:table-row>
         <fo:table-cell>
            <fo:block>07</fo:block>
         </fo:table-cell>
         <fo:table-cell>
            <fo:block>08</fo:block>
         </fo:table-cell>
         <fo:table-cell>
            <fo:block>09</fo:block>
         </fo:table-cell>
      </fo:table-row>
      <fo:table-row>
         <fo:table-cell>
            <fo:block>10</fo:block>
         </fo:table-cell>
         <fo:table-cell>
            <fo:block> </fo:block>
         </fo:table-cell>
         <fo:table-cell>
            <fo:block> </fo:block>
         </fo:table-cell>
      </fo:table-row>
   </fo:table-body>
</fo:table>
于 2012-05-29T12:29:15.370 に答える