Preskoči na glavno vsebino

Konvertor Flexi2XML

Konverzný nástroj Flexi2XML na prevod XML formátov

Avtor: Petr Pech

Flexi2XML možno použiť aj ako konverzný nástroj na prevod dát z/do ABRA Flexi. Dokáže otvoriť súbor, previesť ho do XML, aplikovať naň konverzné nástroje a znova zapísať XML. To zvláda v oboch smeroch.

Zložitejšia konverzia z XLS do Flexi

Flexi má v sebe základné možnosti importu z XLS (Excelu). Pre zložitejšie prípady je potrebné použiť nástroj Flexi2XML.

Konverzia z Excelu

Nástroj Flexi2XML zatiaľ dokáže priamo načítavať XLS súbory (a tým pádom aj REST API). Majme taký XLS:

Cenník

Odberateľ

Cena

8593026341407

FLEXI

1000.0

8593026341407

ARIT

900.0

8593026341407

VFH

1050.0

8593026341407

ABRA

1100.0

Konverzia z XLS do XML

Aby sme mohli vykonať ďalšie spracovanie, je potrebné vytvoriť XML takto (na Linux/Mac OS X je nutné namiesto znaku ; použiť „;"):

flexibee2xml --from-xls soubor.xls --evidence odberatel --to-xml soubor.xml

Výsledkom je XML:

<?xml version="1.0" encoding="utf-8"?><winstrom version="1.0">  <odberatel>    <Ceník>8593026341407</Ceník>    <Odběratel>FLEXI</Odběratel>    <Cena>1000.0</Cena>  </odberatel>  <odberatel>    <Ceník>8593026341407</Ceník>    <Odběratel>ARIT</Odběratel>    <Cena>900.0</Cena>  </odberatel>  <odberatel>    <Ceník>8593026341407</Ceník>    <Odběratel>VFH</Odběratel>    <Cena>1050.0</Cena>  </odberatel>  <odberatel>    <Ceník>8593026341407</Ceník>    <Odběratel>ABRA</Odběratel>    <Cena>1100.0</Cena>  </odberatel></winstrom>

Keby názvy stĺpcov v XLS súbore priamo zodpovedali názvom atribútov vo FlexiXML, boli by sme hotoví (presne takto funguje práca s CSV a XLS vo FlexiBee REST API). Teraz je potrebné pripraviť konverzný skript, ktorý upraví XML. Na to používame štandardné XSL Transformácie (XSLT).

Konverzia z XML do XML (XSLT)

Transformácie XSL (XSLT) sú štandardizovaným nástrojom. Niekedy však bývajú v implementáciách rozdiely, a preto poskytujeme nástroj Flexi2XML, ktorý je postavený na rovnakom jadre ako Flexi. Tým je zaručená maximálna kompatibilita.

Pripravme konverzný skript (odberatel-in.xslt):

<?xml version="1.0" encoding="utf-8"?><xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:java="http://xml.apache.org/xalan/java" version="1.0" exclude-result-prefixes="java">  <xsl:output method="xml" indent="yes" encoding="utf-8"/>  <xsl:template match="/winstrom">    <winstrom version="1.0">      <xsl:apply-templates select="odberatel"/>    </winstrom>  </xsl:template>  <xsl:template match="odberatel">    <odberatel>      <firma>code:<xsl:value-of select="java:flexibee.Tool.toUpper(Odběratel)"/></firma>      <cenik>code:<xsl:value-of select="java:flexibee.Tool.toUpper(Ceník)"/></cenik>      <prodejCena>        <xsl:value-of select="Cena"/>      </prodejCena>    </odberatel>  </xsl:template></xsl:stylesheet>

Existuje mnoho úvodov do XSLT (1, 2, …).

V XSLT je možné iterovať (<xsl:for-each/>), podmieňovať (<xsl:if/>), indexovať obsah (<xsl:key/>). Nejde však o klasické iteratívne programovanie. Vieme, že XSLT má svoje rezervy, ale na tieto účely sa nám javí ako ideálne.

Potom použijeme príkaz:

flexibee2xml --from-xml soubor.xml --run-xslt odberatel-in.xslt --to-xml vysledek.xml

Alebo jedným príkazom s preskočením medzikroku:

flexibee2xml --from-xls soubor.xls --evidence odberatel --run-xslt odberatel-in.xslt --to-xml vysledek.xml

Výsledok možno následne importovať cez Flexi buď priamo, alebo pomocou dávkového spracovania Flexi2XML.

Niekoľko poznámok na záver

Výslednú XSLT transformáciu možno uložiť ako Používateľskú transformáciu alebo ju priamo integrovať do Flexi (musíte nám ju zaslať e-mailom). Takto možno Flexi naučiť jednoducho produkovať alebo konzumovať XML z iných systémov. Použitie používateľskej (alebo integrovanej) XSLT transformácie je popísané v dokumentácii REST-API.

Možno spracovávať aj viacero súborov naraz – to využívame, keď máme jedno CSV/XLS s hlavičkami faktúr a druhé s položkami.

Flexi2XML možno použiť na rozdelenie veľkého XML na mnoho malých a ich následné postupné nahrávanie.

Ste s tem dobili odgovor na svoje vprašanje?