XSLT拆分嵌套表

时间:2014-08-14 09:45:27

标签: xml xslt xslt-2.0 xsl-fo

我正在使用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行后强制页面序列。或者有没有办法对它进行页面排序,以便在每个页面长度上应用内容的页面序列?现在整个内容都在一个页面序列中占用大量内存。

1 个答案:

答案 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>