【问题标题】:XSLT split nested tablesXSLT 拆分嵌套表
【发布时间】:2014-08-14 09:45:27
【问题描述】:

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

【问题讨论】:

  • your last question和这个有什么区别?为什么不采用相同的方法?顺便说一句,为什么单独的页面序列可以优化性能(或内存使用,或两者)?
  • 如果我错了,请纠正我,最后一个方法迭代 ROW,因为我有来自 ROW 上方元素的其他值,它们需要以特定方式重复。 FO 处理器将内容保存在内存中,直到它到达页面序列的末尾,因此通过拆分为许多页面序列,我可以更好地管理内存。
  • @Mathias Muller 我已经解决了。
  • 那么您应该删除此问题或自行回答。谢谢!

标签: xml xslt xslt-2.0 xsl-fo


【解决方案1】:

解决方案,如原始问题中的originally provided by Harsha(OP),此处作为per the guidelines of StackOverflow 的答案提供。此答案应归功于 Harsha。

注意:稍微调整了解决方案,因为它在 for-each-group 选择表达式中使用了不正确或不合逻辑的 XPath。

另外,我删除了parent::*parent::*/ROW 的if-tests,因为它们总是正确的,我删除了value-of 中的fn:string(这些值已经被value-of 转换为字符串)我删除了这两个&lt;/table&gt;,因为它们使 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>

【讨论】:

    猜你喜欢
    • 2011-11-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多