Konvertor Flexi2XML

Konverzní nástroj Flexi2XML pro převod XML formátů

Ota Rádl avatar
Autor: Ota Rádl
Aktualizováno před více než týdnem

Flexi2XML lze použít také jako konverzní nástroj pro převod dat z/do ABRA Flexi. Umí otevřít soubor, převést jej do XML, aplikovat na něj konverzní nástroje a zapsat opět XML. To umí oběma směry.

Složitější konverze z XLS do Flexi

Flexi má v sobě základní možnosti importu z XLS (Excelu). Pro složitější případy je nutné použít nástroj Flexi2XML.

Konverze z Excelu

Nástroj Flexi2XML zatím umí přímo načítat XLS soubory (a tím pádem i REST API). Mějme takovýto XLS:

Ceník

Odběratel

Cena

8593026341407

FLEXI

1000.0

8593026341407

ARIT

900.0

8593026341407

VFH

1050.0

8593026341407

ABRA

1100.0

Konverze z XLS do XML

Abychom mohli provést další zpracování, je nutné vytvořit XML takto (na Linux/Mac OS X je nutné místo znaku ; použít „;“):

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

Výsledkem 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>

Kdyby názvy sloupců v XLS souboru přímo odpovídaly názvům atributů ve FlexiXML, byli bychom hotovi (přesně takto funguje práce s CSV a XLS ve FlexiBee REST API). Nyní je nutné připravit konverzí skript, který upraví XML. K tomu používáme standardní XSL Transformace (XSLT).

Konverze z XML do XML (XSLT)

Transformace XSL (XSLT) jsou standardizovaným nástrojem. Nicméně někdy bývají v implementacích odlišnosti, a proto poskytujeme nástroj Flexi2XML, který je postaven na stejném jádře jako Flexi. Tím je zaručena maximální kompatibilita.

Připravme 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 úvodů do XSLT (1, 2, …).

V XSLT je možné iterovat (<xsl:for-each/>), podmiňovat (<xsl:if/>), indexovat obsah (<xsl:key/>). Nicméně se nejedná o klasické iterativní programování. Víme, že XSLT má své rezervy, ale pro tyto účely se nám jeví jako ideální.

Pak použijeme příkaz:

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

Nebo jedním příkaz s přeskočením mezikroku:

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

Výsledek lze pak naimportovat přes Flexi buď přímo a nebo pomocí dávkového zpracování Flexi2XML.

Několik poznámek závěrem

Výslednou XSLT transformaci lze uložit jako Uživatelskou transformaci nebo jí přímo integrovat do Flexi (musíte nám ji poslat e-mailem). Lze tak Flexi naučit snadno produkovat nebo konzumovat XML z jiných systémů. Použití uživatelské (nebo integrované) XSLT transformace je popsáno v dokumentaci REST-API.

Lze zpracovávat i více souborů najednou – to používáme pokud máme jedno CSV/XLS s hlavičkami faktur a druhé s položkami.

Flexi2XML lze použít pro rozsekání velkého XML na mnoho malých a jejich následné postupné nahrávání.

Dostali jste odpověď na svou otázku?