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>