【问题标题】:Transform Large XML files with XSLT使用 XSLT 转换大型 XML 文件
【发布时间】:2012-10-14 16:58:12
【问题描述】:

我有一个以 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.

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

【问题讨论】:

    标签: xslt client-side large-data


    【解决方案1】:

    我最初的想法是输出一个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 能够从单个输入输出多个文档。一个快速的谷歌给了this。 XSLT 处理器必须将整个输入 XML 加载到内存中,但我假设输出 HTML 将按顺序生成。整体效果应该是浏览器不用加载一个500meg的源文件,而是整个50meg的sn-p。

    【讨论】:

      猜你喜欢
      • 2019-01-15
      • 2019-04-11
      • 1970-01-01
      • 1970-01-01
      • 2014-11-15
      • 1970-01-01
      • 2015-10-14
      • 1970-01-01
      相关资源
      最近更新 更多