使用XSLT转换大型XML文件
我有一个以HTML格式输出报告的程序。平均来说,它们大约有5-10 MB,但我见过一些极端情况,它们有500 MB。这些报告纯粹是客户端的,这里没有涉及服务器 问题是浏览器将一直挂起,直到加载所有内容,有时甚至不会加载内容。我试图找到一个解决方案,让打开报告的人始终可以打开它。打开报告的人应该能够使用浏览器和其中可用的任何技术打开报告 我提出了一个解决方案,通过让我们的程序输出xml来打开一个以前是100MB的报告,然后通过xslt将其转换为html,但是用户仍然需要等待整个内容加载到内存中。这些diff节点中的所有内容都加载到一个表的两行中,它们的顺序无关紧要 XML:使用XSLT转换大型XML文件,xslt,client-side,large-data,Xslt,Client Side,Large Data,我有一个以HTML格式输出报告的程序。平均来说,它们大约有5-10 MB,但我见过一些极端情况,它们有500 MB。这些报告纯粹是客户端的,这里没有涉及服务器 问题是浏览器将一直挂起,直到加载所有内容,有时甚至不会加载内容。我试图找到一个解决方案,让打开报告的人始终可以打开它。打开报告的人应该能够使用浏览器和其中可用的任何技术打开报告 我提出了一个解决方案,通过让我们的程序输出xml来打开一个以前是100MB的报告,然后通过xslt将其转换为html,但是用户仍然需要等待整个内容加载到内存中。这
内容
内容
执行此转换的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
致:
然后,在生成的HTML中,您可以硬编码如下内容:
<a href="first10percent.html">Last Page</a>
<a href="second10percent.html">Next Page</a>
XSLT2.0能够从单个输入输出多个文档。谷歌很快给出了一个答案。XSLT处理器必须将整个输入XML加载到内存中,但我假设输出HTML将按顺序生成。总体效果应该是浏览器不必加载一个500毫克的源文件,而是加载整个文件的一个50毫克的片段
/container
/first10percent.html
/second10percent.html
/third10percent.html
...
<a href="first10percent.html">Last Page</a>
<a href="second10percent.html">Next Page</a>