使用XSLT转换大型XML文件

我有一个以
HTML格式输出报告的程序.平均而言,它们大约是5-10 MB,但我看到它们是500 MB的极端情况.这些报告纯粹是客户端,这里没有涉及服务器.

问题是浏览器将挂起,直到加载所有内容,有时甚至不会加载内容.我试图找到一个解决方案,打开报告的人总是可以打开它.打开报告的人应该能够使用浏览器和其中的任何可用技术打开它们.

我已经提出了一个解决方案,通过让我们的程序输出xml打开一个之前为100MB的报告,然后通过xslt将其转换为html,但用户仍然需要等待整个事情加载到内存中.这些差异节点内的所有内容都被加载到表的2行中,并且它们的顺序无关紧要.

XML

    <diff>
        <parent loc="some string"/>
        <right> content</right>
        <left> content </left>
    </diff>

进行此转换的XSLT如下:

<xsl:for-each select="./diff">
    <table align="center" border="1px" width="602">
    <tbody>
    <tr>
    <td colspan="2"><xsl:value-of select="./parent/@loc"/></td>
    </tr>
    <tr>
    <td width="50%" align="left">
    <xsl:if test="./left/text()">
        <xsl:value-of select="./left/text()"/>
    </xsl:if>
    <xsl:if test="not(./left/text())">
         <xsl:variable name="left">
             <xsl:apply-templates select="./left/*" mode="serialize"/>
         </xsl:variable>
         <xsl:value-of select="$left"/>
    </xsl:if>
    </td>
    <td width="50%" align="right">
    <xsl:if test="./right/text()">
        <xsl:value-of select="./right/text()"/>
    </xsl:if>
    <xsl:if test="not(./right/text())">
        <xsl:variable name="right">
            <xsl:apply-templates select="./right/*" mode="serialize"/>
        </xsl:variable>
    <xsl:value-of select="$right"/>
    </xsl:if>
    </td>
    </tr>
    </tbody>
    </table>
</xsl:for-each>

我想知道是否有一种方法可以更快地加载文件或不等待整个表在显示页面之前加载到内存中.

我不想加载一个javascript库来执行此操作,因为我们不想在查看这些报表时担心连接,也不想在每个人的计算机上安装一堆文件,但我可以在xslt中使用一些脚本.

我知道这是一个奇怪的场景,并不是构建应用程序的理想方式,但我们没有时间改变生成这些报告的方式.

最佳答案 我最初的想法是输出一个html文件目录.所以,如果我们开始

/supersize500MB.html

至:

/container
    /first10percent.html
    /second10percent.html
    /third10percent.html
    ...

然后在您生成的HTML中,您可以对以下内容进行硬编码:

<a href="first10percent.html">Last Page</a>
<a href="second10percent.html">Next Page</a>

XSLT 2.0能够从单个输入中输出多个文档.快速google给了this.XSLT处理器必须将整个输入XML加载到内存中,但我假设输出HTML将按顺序生成.整体效果应该是浏览器不必加载500meg源文件,而是整个50meg片段.

点赞