レポートを HTML 形式で出力するプログラムがあります。平均すると 5 ~ 10 MB 程度ですが、500 MB になる極端なケースも見てきました。これらのレポートは純粋にクライアント側であり、サーバーは関与しません。
問題は、すべてのコンテンツが読み込まれるまでブラウザがハングアップし、場合によってはコンテンツを読み込まないことです。レポートを開いた人がいつでも開くことができる解決策を見つけようとしています。レポートを開く人は、ブラウザとそこで利用可能なテクノロジーを使用してレポートを開くことができる必要があります。
以前は 100MB だったレポートを、プログラムで xml を出力して開き、xslt を介して html に変換するソリューションを思いつきましたが、ユーザーは全体がメモリに読み込まれるまで待つ必要があります。すべてのコンテンツはこれらの diff ノード内にあり、テーブルの 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 内でいくつかのスクリプトを使用できます。 .
これが奇妙なシナリオであり、アプリを構成する理想的な方法ではないことは承知していますが、これらのレポートを生成する方法を変更する時間はありません。