4

レポートを 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 内でいくつかのスクリプトを使用できます。 .

これが奇妙なシナリオであり、アプリを構成する理想的な方法ではないことは承知していますが、これらのレポートを生成する方法を変更する時間はありません。

4

1 に答える 1

2

私の最初の考えは、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には、単一の入力から複数のドキュメントを出力する機能があります。簡単なグーグルがこれを与えました。XSLTプロセッサは、入力XML全体をメモリにロードする必要がありますが、出力HTMLは順番に生成されると思います。全体的な効果は、ブラウザが500メガのソースファイルをロードする必要はなく、全体の50メガのスニペットをロードする必要があるということです。

于 2012-10-25T07:56:59.320 に答える