XSLT为Apache FOP生成动态列

时间:2013-06-18 21:32:03

标签: xslt apache-fop

我需要创建一个包含3列区域的动态表

更好的例子: 我不知道你是否会理解这一点,但“----”只是在帖子中格式化表格

| --Number-- | --Doc-- | --status --------- | --Number-- | --Doc-- | --status ------ --- | --Number-- | --Doc-- | --Status-- | | ----- 11 ------ | 1111- | - _____________--------- | --22 ------- | 2222 - | ______________---- ------ | ---- 33 ----- | 3333- | _______________ |

| ----- 44 ----- | 4444- | - _____________ -------- | ------------ | ------ ---- | ---------- | --------- | -------------- | --------- | ------------ |

我的XML:

    <Details>
      <Detail>
        <Number>11</Number> 
        <Doc>1111</Doc>
      </Detail>
      <Detail>
        <Number>22</Number> 
        <Doc>2222</Doc> 
      </Detail>
      <Detail>
        <Number>33</Number> 
        <Doc>3333</Doc> 
      </Detail>
      <Detail>
        <Number>44</Number> 
        <Doc>4444</v> 
      </Detail>
    </Details>

我试着像帖子那样做,但我做不到。 XSLT Generate Dynamic Rows and Columns for Apache FOP

1 个答案:

答案 0 :(得分:0)

这是递归的一种方法,我没有添加“FO”命名空间,但你应该能够使用它来实现。如果您愿意,也可以添加一个测试来填充空单元格。

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0">
<xsl:output indent="yes"/>
<xsl:template match="Details">
   <table>
    <xsl:call-template name="rows">
        <xsl:with-param name="Details" select="*"/>
    </xsl:call-template>
   </table>
</xsl:template>
<xsl:template name="rows">
    <xsl:param name="Details"/>
    <row>
        <xsl:apply-templates select='$Details[position() &lt; 4]/*'/>
    </row>
    <xsl:if test="$Details[4]">
        <xsl:call-template name="rows">
            <xsl:with-param name="Details" select="$Details[position() &gt; 3]"/>
        </xsl:call-template>
    </xsl:if>
</xsl:template>
<xsl:template match="Number | Doc">
    <cell>
        <xsl:value-of select="."/>
    </cell>
</xsl:template>
</xsl:stylesheet>

输出是使用上面的XML(我添加了一些Detail元素以确保一切正常):

<?xml version="1.0" encoding="utf-8"?>
<table>
  <row>
      <cell>11</cell>
      <cell>1111</cell>
      <cell>22</cell>
      <cell>2222</cell>
      <cell>33</cell>
      <cell>3333</cell>
   </row>
   <row>
      <cell>44</cell>
      <cell>4444</cell>
      <cell>5</cell>
      <cell>55</cell>
      <cell>6</cell>
      <cell>66</cell>
   </row>
   <row>
      <cell>7</cell>
      <cell>777</cell>
   </row>
 </table>