Java XSL多列交换
我有一个xml,它列出了客户的呼叫,我需要在两列中显示。根据调用的数量,列表可以是单页-单列、单页-双列或多页-双列 我必须使用基本的apace fop,不能访问天线室或类似的图书馆 当我使用for each时,我可以显示调用,但只能显示在单个列上。我一辈子都不能去双栏 我最接近的是下面这段由@Eliot Kimber拍摄的视频,但我就是无法回避 我试着使用column mod,但还是在一列中列出了所有调用 我的XML如下所示Java XSL多列交换,java,xml,xslt,xsl-fo,apache-fop,Java,Xml,Xslt,Xsl Fo,Apache Fop,我有一个xml,它列出了客户的呼叫,我需要在两列中显示。根据调用的数量,列表可以是单页-单列、单页-双列或多页-双列 我必须使用基本的apace fop,不能访问天线室或类似的图书馆 当我使用for each时,我可以显示调用,但只能显示在单个列上。我一辈子都不能去双栏 我最接近的是下面这段由@Eliot Kimber拍摄的视频,但我就是无法回避 我试着使用column mod,但还是在一列中列出了所有调用 我的XML如下所示 <CallsMade fromNumber="9876543
<CallsMade fromNumber="987654321">
<CallItem>
<DialledNumber>0123456789</DialledNumber>
<DateTime>2019-07-15 15:35:35</DateTime>
<Duration>00:04:23</Duration>
<Cost>$1.24</Cost>
</CallItem>
<CallItem>
<DialledNumber>0123456790</DialledNumber>
<DateTime>2019-07-15 15:36:35</DateTime>
<Duration>00:04:24</Duration>
<Cost>$1.25</Cost>
</CallItem>
<CallItem>
<DialledNumber>0123456791</DialledNumber>
<DateTime>2019-07-15 15:37:35</DateTime>
<Duration>>00:04:25</Duration>
<Cost>$1.26</Cost>
</CallItem>
<CallItem>
<DialledNumber>0123456792</DialledNumber>
<DateTime>2019-07-15 15:38:35</DateTime>
<Duration>>00:04:26</Duration>
<Cost>$1.27</Cost>
</CallItem>
<CallItem>
<DialledNumber>0123456793</DialledNumber>
<DateTime>2019-07-15 15:39:35</DateTime>
<Duration>>00:04:27</Duration>
<Cost>$1.28</Cost>
</CallItem>
<CallItem>
<DialledNumber>0123456794</DialledNumber>
<DateTime>2019-07-15 15:40:35</DateTime>
<Duration>>00:04:28</Duration>
<Cost>$1.29</Cost>
</CallItem>
<CallItem>
<DialledNumber>0123456795</DialledNumber>
<DateTime>2019-07-15 15:41:35</DateTime>
<Duration>>00:04:29</Duration>
<Cost>$1.30</Cost>
</CallItem>
<CallItem>
<DialledNumber>0123456931</DialledNumber>
<DateTime>2019-07-15 17:57:34</DateTime>
<Duration>00:06:45</Duration>
<Cost>$2.66</Cost>
</CallItem>
<CallsMade>`
0123456789
2019-07-15 15:35:35
00:04:23
$1.24
0123456790
2019-07-15 15:36:35
00:04:24
$1.25
0123456791
2019-07-15 15:37:35
>00:04:25
$1.26
0123456792
2019-07-15 15:38:35
>00:04:26
$1.27
0123456793
2019-07-15 15:39:35
>00:04:27
$1.28
0123456794
2019-07-15 15:40:35
>00:04:28
$1.29
0123456795
2019-07-15 15:41:35
>00:04:29
$1.30
0123456931
2019-07-15 17:57:34
00:06:45
$2.66
`
XSL,它有多个页面,但下面只有一列
<fo:block-container start-indent="0mm" left="5mm" width="48%" span="all">
<fo:table table-layout="fixed" width="100%" font-size="5pt" text-align="center" display-align="center" span="all">
<fo:table-column column-width="proportional-column-width(10)"/>
<fo:table-column column-width="proportional-column-width(15)"/>
<fo:table-column column-width="proportional-column-width(12)"/>
<fo:table-column column-width="proportional-column-width(8)"/>
<fo:table-body font-size="95%" >
<xsl:for-each select="CallItem">
<fo:table-row height="4mm" text-align="center" display-align="center">
<fo:table-cell>
<fo:block>
<xsl:value-of select="DialledNumber"/>
</fo:block>
</fo:table-cell>
<fo:table-cell>
<fo:block>
<xsl:value-of select="DateTime"/>
</fo:block>
</fo:table-cell>
<fo:table-cell>
<fo:block>
<xsl:value-of select="Duration"/>
</fo:block>
</fo:table-cell>
<fo:table-cell>
<fo:block>
<xsl:value-of select="Cost"/>
</fo:block>
</fo:table-cell>
</fo:table-row>
</xsl:for-each>
</fo:table-body>
</fo:table>
</fo:block-container>
我想知道是否有人可以帮我显示下面的列表
看来你真的只需要知道你的CallItem是否少于60个
。如果小于60,则使表跨越两列,如果不是,则使其跨越一列。正常的分页符将负责在列和页之间拆分表
<xsl:template match="/">
<fo:root xml:lang="en">
<fo:layout-master-set>
<fo:simple-page-master master-name="spm">
<fo:region-body column-count="2" margin="36pt" />
</fo:simple-page-master>
</fo:layout-master-set>
<fo:page-sequence master-reference="spm">
<fo:flow flow-name="xsl-region-body">
<xsl:apply-templates />
</fo:flow>
</fo:page-sequence>
</fo:root>
</xsl:template>
<xsl:template match="CallsMade">
<fo:block span="all">
<xsl:value-of select="@fromNumber" />
</fo:block>
<fo:block-container>
<xsl:if test="count(CallItem) < 60">
<xsl:attribute name="span">all</xsl:attribute>
</xsl:if>
<fo:table table-layout="fixed" width="100%" font-size="5pt" text-align="center" display-align="center" span="all">
<fo:table-column column-width="proportional-column-width(10)"/>
<fo:table-column column-width="proportional-column-width(15)"/>
<fo:table-column column-width="proportional-column-width(12)"/>
<fo:table-column column-width="proportional-column-width(8)"/>
<fo:table-body font-size="95%" >
<xsl:apply-templates select="CallItem" />
</fo:table-body>
</fo:table>
</fo:block-container>
</xsl:template>
<xsl:template match="CallItem">
<fo:table-row height="4mm" text-align="center" display-align="center">
<fo:table-cell>
<fo:block>
<xsl:value-of select="DialledNumber"/>
</fo:block>
</fo:table-cell>
<fo:table-cell>
<fo:block>
<xsl:value-of select="DateTime"/>
</fo:block>
</fo:table-cell>
<fo:table-cell>
<fo:block>
<xsl:value-of select="Duration"/>
</fo:block>
</fo:table-cell>
<fo:table-cell>
<fo:block>
<xsl:value-of select="Cost"/>
</fo:block>
</fo:table-cell>
</fo:table-row>
</xsl:template>
全部的
“根据调用的数量,列表可以是单页-单栏、单页-双栏或多页-双栏”:您是否知道希望XSLT生成不同FO结果的数字值?谢谢Martin。第一页有另一个块,可以是1-n行。一个页面最多可以有60行,因此在60行之后,下一列…在120次调用下一页之后…我的FO不好,但是对于XSLT,如果您能够更改它并且可以使用XSLT 2(在Java世界中可以通过使用Saxon 9轻松实现),您可以简单地使用位置分组将60行的每个块包装到自己的容器中,如果有多个块,则可以切换span
属性。我在和中尝试了一些示例,使用低于60的值来测试测试数据。您可能希望为XSL-FO添加一个标记,以便在FO方面获得更多知识帮助如果没有格式化程序,您就无法实现这一点,除非它们支持诸如RenderX的flow部分这样的扩展,您可以在其他流中放置多列。