我正在使用XSLT2进行XSL:FO转换。我需要有正确的页面排序来优化性能。
我的XML看起来像这样
<DOCUMENT xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" >
<A>
<B>
<C TYPE="1.">
<D TYPE="1 . 1">
<ROW>
<Date>06/JUN/2014</Date>
</ROW>
<ROW>
<Date>07/JUN/2014</Date>
</ROW>
<Total>
<Amount>10.50</Amount>
</Total>
</D >
<D TYPE="1 . 2">
<ROW>
<Date>05/JUN/2014</Date>
</ROW>
<ROW>
<Date>06/JUN/2014</Date>
</ROW>
<Total>
<Amount>20.70</Amount>
</Total>
</D >
</C>
<C TYPE="2">
<D TYPE="2 . 1">
<ROW>
<Date>28/JUN/2014</Date>
</ROW>
<Total>
<Duration_Volume>1</Duration_Volume>
<Amount>1.00</Amount>
</Total>
</D >
<D TYPE="2 . 2">
<ROW>
<Date>11/JUN/2014</Date>
</ROW>
<Total>
<Duration_Volume>1</Duration_Volume>
<Amount>1.00</Amount>
</Total>
</D >
</C>
</TRANSACTION>
</MOBILE>
我的XSLT看起来像这样
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0" exclude-result-prefixes="#all">
<xsl:output indent="yes"/>
<xsl:template match="DOCUMENT">
<page-sequence>
<xsl:for-each select="/DOCUMENT/A/B/C">
<table>
<xsl:for-each select="@TYPE">
<table_row>
<xsl:value-of select="string(.)"/>
</table_row>
</xsl:for-each>
<xsl:for-each select="D">
<table>
<xsl:for-each select="@TYPE">
<table_row>
<xsl:value-of select="string(.)"/>
</table_row>
</xsl:for-each>
<xsl:for-each select="ROW">
<xsl:for-each select="Date">
<table_row>
<xsl:value-of select="node()"/>
</table_row>
</xsl:for-each>
</xsl:for-each>
</table>
</xsl:for-each>
</table>
</xsl:for-each>
</page-sequence>
</xsl:template>
</xsl:stylesheet>
我需要在每50次出现ROW之后获得页面序列。有没有办法在每50行后强制页面序列。或者有没有办法对它进行页面排序,以便在每个页面长度上应用内容的页面序列?现在整个内容都在一个页面序列中占用大量内存。
答案 0 :(得分:0)
解决方案,原始问题中的originally provided by Harsha(OP),此处作为per the guidelines of StackOverflow的答案提供。这个答案应该归功于Harsha。
注意:稍微调整了解决方案,因为它在for-each-group
选择表达式中使用了不正确或不合逻辑的XPath。
另外,我删除了parent::*
和parent::*/ROW
的if-tests,因为它们始终为true,我删除了fn:string
的值 - (值已经转换为a字符串value-of
)并删除了两个</table>
,因为它们使XML无效。
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0" exclude-result-prefixes="#all">
<xsl:output indent="yes"/>
<xsl:template match="DOCUMENT">
<xsl:for-each-group select="A/B/C/*/ROW" group-adjacent="(position()-1) idiv 50">
<page-sequence>
<xsl:for-each select="current-group()">
<table>
<xsl:if test="not(preceding-sibling::*)">
<table_row>
<xsl:value-of select="../../@TYPE"/>
</table_row>
</xsl:if>
<table>
<xsl:if test="not(preceding-sibling::ROW)">
<xsl:for-each select="../@TYPE">
<table_row>
<xsl:value-of select="."/>
</table_row>
</xsl:for-each>
</xsl:if>
<xsl:for-each select="Date">
<table_row>
<xsl:value-of select="node()"/>
</table_row>
</xsl:for-each>
</xsl:for-each>
</page-sequence>
</xsl:for-each-group>
</xsl:template>
</xsl:stylesheet>