úterý, března 13, 2007

XML JOIN pomocí XSLT aneb XSLT nad dvěma XML

Na podzim jsem řešil XML problém. Měl jsme dva XML soubory: jeden s exportem klasické DB tabulky a druhý s číselníkem. Potřeboval jsem k řádkům z prvního souboru zjistit pomocí cizího klíče odpovídající hodnotu z číselníku a na základě tohoto spojení vygenerovat opravný SQL skript, který se měl spustit ve zdrojové DB Oracle. A to vše nejlépe jako jednoduchou utilitku pro BFU.

Jenže jak na to? Pokud by oba soubory byly v normální DB, použil bych join; jenže teď jsou v XML. Import do Oracle DB není pro BFU ("My tu máme nějakou DB? Cože? Jaké přístupové údaje?"). Zvláštní XML DB a nad ní data spojovat taky není ono - to už nebude jednoduchá utilita. Stačila by jednoúčelová utilita, která by porovnávala hodnoty z obou souborů. A co takhle XSLT? To přece pracuje jenom nad jedním XML souborem. Omyl...

Vševěd Google opět nezklamal: XML databáze Ashpool, resp. její část libxslt, předpis doJoin.xsl, nic jiného jsem nepotřeboval. Přímo ve stylu si podle potřeb upravíte parametry a můžete transformovat. Ano, přes dvě XML.

Popis parametrů:

  • datastore - umístění obou XML souborů, nad kterými se bude pracovat
  • j1, j2 - vazební sloupce
  • t1, t2 - názvy XML souborů
  • type - typ vazby (inner / outer)
  • dir - směr vazby (left /right), neimplementováno
Soubory se tedy budou hledat na $datastore,'/',$t1,'.xml, resp. $t2. V mém případě tedy (pozor na uvozovky) např.:
<xsl:param name="datastore" select="'../'"></xsl:param>
...
<xsl:param name="t1" select="'ev-log-pars'"></xsl:param>
<xsl:param name="t2" select="'maps-pars'"></xsl:param>
...

Takže už jenom stačilo napsat jednoduchý javový prográmek, který spouštěl transformaci. V případě změny struktury stačí jen změnit XSLT soubor, bez potřeby spouštět IDE a nové kompilace.

Ashpool se mimochodem přestěhoval (resp. jeho web) a byl ukončen další vývoj této databáze. Na novém umístění zlobí download a hlavně tam nenajdete zdrojové kódy, takže je lepší používat starší verzi ze SourceForge, kde se přímo přes web dostanete ke zdroji v CVS.

Žádné komentáře:

Okomentovat