Zkoušel jste Saxon? Ten bz měl mít v sobě nějakou podporu
streamování.
http://saxonica.blogharbor.com/blog/_archives/2007/9/25/3252121.html
Martin
On Jun 30, 2008, at 12:06 PM, Tomáš Záluský wrote:
Zdravím konferenci,
mám 90MB XML soubor:
<root>
<foo>...</foo>
<foo>...</foo>
...
</root>
Pomocí XSLT (Xalan 2.7.0) chci docílit transformace na tvar
<output>
<hoo>...</hoo>
<hoo>...</hoo>
...
</output>
Elementy foo mají v sobě ještě další elementy, ale jejich
struktura není složitá a a velikost je cca 2 obrazovky, obdobně
to platí i pro elementy hoo. Pro každý element foo se generuje
element hoo.
Problém je v tom, že u velkého souboru dochází paměť. Paměť
nemohu navýšit a nemá to podle mne ani smysl, protože to, co ji
spotřebovává, je množství elementů foo, ne jejich velikost (ta
je cca na 1-2 obrazovky). Přitom elementy foo jsou na sobě
nezávislé, pro XSL transformaci daného elementu foo nepotřebuji
znalost okolních elementů.
Chápu, že je potřeba zabránit tomu, aby si parser načetl celý
dokument, ale ke spotřebě paměti dochází, i pokud soubor čtu
jako SAXSource. Předpokládám, že i když Xalan umí přečíst
soubor SAXem, ve výsledku je nakonec stejně celý dokument. Mohl
bych napsat content handler, který by načítal jednotlivé elementy
foo do dočasného souboru a na nich postupně volal transformaci,
ale přijde mi to až jako poslední možnost. Zajímalo by mne
spíš, zda by takový content handler šlo přímo použít s
příslušným transformerem tak, aby v daném okamžiku byl v
paměti jen jeden element foo.
Nemáte s tím prosím někdo zkušenost? Předem dík.
Tomáš Záluský