XSLで大量のデータをHTMLに変換すると、パフォーマンスの問題が頻繁に発生します。このデータは通常、おおよそこの形式の非常に大きなテーブルのほんの2、3です。
<table>
<record>
<group>1</group>
<data>abc</abc>
</record>
<record>
<group>1</group>
<data>def</abc>
</record>
<record>
<group>2</group>
<data>ghi</abc>
</record>
</table>
変換中に、このようなレコードを視覚的にグループ化したい
+--------------+
| Group 1 |
+--------------+
| abc |
| def |
+--------------+
| Group 2 |
+--------------+
| ghi |
+--------------+
ばかげた実装はこれです(セットはhttp://exslt.orgからのものです。実際の実装は少し異なります。これは単なる例です):
<xsl:for-each select="set:distinct(/table/record/group)">
<xsl:variable name="group" select="."/>
<!-- This access needs to be made faster : -->
<xsl:for-each select="/table/record[group = $group]">
<!-- Do the table stuff -->
</xsl:for-each>
</xsl:for-each>
これはO(n^2)
複雑になる傾向があることは容易に理解できます。さらに悪いことに、すべてのレコードに多くのフィールドがあるためです。操作されるデータは数十MBに達する可能性があり、レコード数は最大5000に達する可能性があります。最悪の場合、すべてのレコードに独自のグループと50のフィールドがあります。さらに悪いことに、さらに別のレベルのグループ化が可能であり、これを可能にしますO(n^3)
これで、かなりの数のオプションがあります。
- マップとネストされたデータ構造を含む、これに対するJavaソリューションを見つけることができました。しかし、XSLTスキルを向上させたいので、それが実際には最後のオプションです。
- Xerces / Xalan / Exsltの優れた機能に気づいていないかもしれません。これは、グループ化をはるかにうまく処理できます。
- 私は多分ある種のインデックスを構築することができます
/table/record/group
<xsl:apply-templates/>
このユースケースでは、アプローチがアプローチよりも明らかに速いことを私に証明できます<xsl:for-each/>
。
O(n^2)
この複雑さをどのように減らすことができると思いますか?