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.

14.7 Regulární výrazy

Regulární výrazy umožňují snadno testovat shodu řetězce s maskou (regulárním výrazem) a lze je použít k manipulaci s řetězci. XPath 2.0 i XSLT 2.0 byly konečně rozšířeny o podporu regulárních výrazů a tak je mnohem snazší zpracovávat data, která jsou strukturována jen na úrovni textu a ne na úrovni elementů.

XSLT 2.0 navíc podporuje novou funkci unparsed-text(), která umí načíst obsah textového souboru a vrátit jej jako řetězec. V kombinaci s tím, že transformace nyní nemusí mít na vstupu dokument XML, ale může začínat pojmenovanou šablonou, jde v XSLT 2.0 snadno psát styly, které do XML konvertují data ze starších textových formátů.

My si použití regulárních výrazů ukážeme na konverzi textového souboru CSV do podoby XML dokumentu.

Příklad 14.10. Textový soubor ve formátu CSV – zamestnanci.csv

1164|Procházka Karel|2021
1168|Novotná Alena|2021 
1230|Klíma Josef|2x2
1564|Pinkas Josef|2021
2021|Kládová Adéla|

Příklad 14.11. Konverze textového souboru do XML pomocí regulárních výrazů v XSLT 2.0 – csv2zam.xsl

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

<xsl:output indent="yes"/>  

<!-- Implicitní jméno vstupního souboru -->
<xsl:param name="soubor">zamestnanci.csv</xsl:param>

<!-- Načtení celého vstupu do jedné proměnné jako řetězec -->  
<xsl:variable name="csv" select="unparsed-text($soubor, 'windows-1250')"/>

<!-- Pojmenovaná šablana, která spouští transformaci -->  
<xsl:template name="csv2zam">

  <!-- Do proměnné si vstupní soubor rozsekáme po řádkách.
       Každá řádka bude obalena elementem radka -->
  <xsl:variable name="radky">
    <xsl:analyze-string select="$csv" regex="^.*$" flags="m">
      <xsl:matching-substring>
        <radka>
          <xsl:value-of select="."/>
        </radka>
      </xsl:matching-substring>
    </xsl:analyze-string>
  </xsl:variable>

  <!-- Každá řádka vstupu se nyní analyzuje samostatně -->
  <zamestnanci>
    <xsl:for-each select="$radky/radka">
      <xsl:analyze-string select="." regex="^(\d+)\|(.+)\|(\d*)\s*$">
        <xsl:matching-substring>
          <zamestnanec oc="{regex-group(1)}">
            <jmeno><xsl:value-of select="regex-group(2)"/></jmeno>
            <xsl:if test="normalize-space(regex-group(3)) != ''">
              <sef><xsl:value-of select="normalize-space(regex-group(3))"/></sef>
            </xsl:if>
          </zamestnanec>
        </xsl:matching-substring>
        <xsl:non-matching-substring>
          <xsl:message>
            <xsl:text>Chyba ve vstupních datech: </xsl:text>
            <xsl:value-of select="."/>
          </xsl:message>
        </xsl:non-matching-substring>
      </xsl:analyze-string>
    </xsl:for-each>
  </zamestnanci>
  
</xsl:template>

</xsl:stylesheet>

Transformaci nyní při spouštění předáme jen název stylu a startovní šablony. Pomocí parametru by šlo změnit i jméno souboru, ze kterého se data importují.

c:\src>saxon8 -it csv2zam csv2zam.xsl
Chyba ve vstupních datech: 1230|Klíma Josef|2x2 
<?xml version="1.0" encoding="utf-8"?>
<zamestnanci>
   <zamestnanec oc="1164">
      <jmeno>Procházka Karel</jmeno>
      <sef>2021</sef>
   </zamestnanec>
   <zamestnanec oc="1168">
      <jmeno>Novotná Alena</jmeno>
      <sef>2021</sef>
   </zamestnanec>
   <zamestnanec oc="1564">
      <jmeno>Pinkas Josef</jmeno>
      <sef>2021</sef>
   </zamestnanec>
   <zamestnanec oc="2021">
      <jmeno>Kládová Adéla</jmeno>
   </zamestnanec>
</zamestnanci>
© 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