Potřebujete pomoci s XSLT?
Nabízím školení, konzultace, vývoj XSLT kódu na zakázku. Nevájte a kontaktujte mne.

Podpořte provoz stránek
Platba probíhá pomocí služby PayPal a je možné platit kartou nebo převodem z vašeho PayPal účtu.

11.4 Ukázka generování SQL z XML

Pokud potřebujeme data uložená v XML rychle převést do relační databáze, můžeme k tomu použít i XSLT. To umí generovat i textové soubory, není proto problém vytvořit styl pro vytváření série SQL příkazů.

Příklad 11.6. Převod XML do SQL – zam2sql.xsl

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                version="1.0">

<xsl:output method="text" encoding="windows-1250"/>

<xsl:strip-space elements="*"/>

<xsl:template match="zamestnanec">
  <xsl:text>INSERT INTO Zamestnanci (OsobniCislo, Jmeno, OCSefa) </xsl:text>
  <xsl:text>VALUES (</xsl:text>
  <xsl:value-of select="@oc"/>
  <xsl:text>, '</xsl:text>
  <xsl:value-of select="jmeno"/>
  <xsl:text>', </xsl:text>
  <xsl:choose>
    <xsl:when test="sef">
      <xsl:value-of select="sef"/>
    </xsl:when>
    <xsl:otherwise>
      <xsl:text>NULL</xsl:text>
    </xsl:otherwise>
  </xsl:choose>
  <xsl:text>);&#xA;</xsl:text>
</xsl:template>

</xsl:stylesheet>

Po aplikování tohoto stylu na seznam zaměstnanců dostaneme následující dávku v SQL:

INSERT INTO Zamestnanci (OsobniCislo, Jmeno, OCSefa) VALUES (1164, 'Procházka Karel', 2021);
INSERT INTO Zamestnanci (OsobniCislo, Jmeno, OCSefa) VALUES (1168, 'Novotná Alena', 2021);
INSERT INTO Zamestnanci (OsobniCislo, Jmeno, OCSefa) VALUES (1230, 'Klíma Josef', 1168);
INSERT INTO Zamestnanci (OsobniCislo, Jmeno, OCSefa) VALUES (1564, 'Pinkas Josef', 2021);
INSERT INTO Zamestnanci (OsobniCislo, Jmeno, OCSefa) VALUES (2021, 'Kládová Adéla', NULL);

Ukázka je v zásadě funkční, ale má jeden problém. Pokud by jméno zaměstnance obsahovalo apostrof, bude tento apostrof beze změny vložen i do generovaného SQL kódu, kde tím pádem vznikne syntaktická chyba. V textových konstantách SQL se musí apostrof zdvojit. Pro zdánlivě jednoduchou úlohu nahrazení jednoho řetězce (apostrofu) jiným řetězcem (dvěma apostrofy) není v XSLT přímá podpora. Podobnou funkci samozřejmě můžeme naimplementovat jako rekurzivní šablonu, která potřebnou funkcionalitu složí z elementárních řetězcových funkcí XPathu.

Naštěstí se jedná o tak častý problém, že již byl mnohokrát vyřešen. Nemusíme si tedy sami psát žádný komplikovaný kód, stačí si z Internetu stáhnout hotovou knihovnu a použít ji v našem stylu. Jednou z takových volně dostupných knihoven je XSLT Standard Library.

© Jiří Kosek 2014

Tento dokument je určen výhradně pro osobní potřebu seznámení s jazykem XSLT. Jakékoliv jiné použití, včetně dalšího šíření, pořizování kopií, použití při školeních a výuce apod. je výslovně zakázáno a bude považováno za porušení autorských práv.


Copyright © 2000-2014 Jiří Kosek