Příklad transform
V příkladu nakombinujeme použití dvou požadavků, jeden sql-query na podávání SQL SELECT dotazů do databáze a druhý get-document na získávání instancí strukturovaných xml dokumentů. V příkladu půjde o to, dotázat se na dokumenty vložené do evidence za poslední týden a tyto dokumenty poskládané vrátit v odpovědi.
Požadavek odesílaný na server bude vypadat takto:
<transform id="test" encode="xml"><input><request><sql-query><select type="kontakt">SELECT pdk FROM dbo.knt-!- WHERE xc_crdt >= DATEADD(WEEK, -1, GETDATE()) ORDER BY xc_crdt </select></sql-query></request></input><steps><perform-request/><perform-transform xslt="/examples/transform-request.xsl"><param name="max-count" value="100"/></perform-transform><perform-request/></steps></transform>
Vstupní dotaz využívá obecné vlastnosti dostupné automaticky v každém flexideo dokumentu, konkrétně datum vytvoření pro výběr týden starých položek. Výsledkem dotazu je pak seznam pdk, tedy primárních klíčů dokumentů, které byly v uplnulém týdnu změněny. V atributu type v obálce dotazu je pak uveden požadovaný typ dokumentu, v našem případě dokument typu kontakt.
Protože byl do vstupního uzlu input vložen požadavek s dotazem, který má být před první transformací vykonán, je třeba, aby prvním krokem, tedy prvním potomkem uzlu steps byl příkaz perform-request. Kdybychom do vstupního input uzlu umístili xml určené k transformaci, byl byl prvním (a možná i jediným) krokem v uzlu steps příkaz perform-transform. Ale v příkladu jde o to, nejprve zpracovat dotaz.
Výstup z dotazu, který bude v druhém kroku sekvenčního požadavku transform zpracováván šablonou a bude tedy pro tento krok vstupním xml, může vypadat nějak takto:
<response type="ok"><sql-query-result><result type="kontakt"><row pdk="1"/><row pdk="2"/><row pdk="3"/><row pdk="4"/><row pdk="5"/></result></sql-query-result></response>
Tento obsah by mohl takto vypadat po několika dnech od zavedení typu kontakt, kde se v této době zavedlo zatím jen pět kontaktů.
Jako druhým krokem je příkaz perform-transform s šablonou umístěnou pro tento účelem do složky examples, která nemusí být fyzicky na webovém sídle, ale může být nastavena jako takzvaná virtuální (viz. složky serveru).
Obsah souboru se šablonou transform-request.xsl může vypadat například takto:
<?xml version="1.0" encoding="utf-8"?><xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"><xsl:output encoding="utf-8" method="xml"/><xsl:param name="max-count" select="0"/><xsl:template match="/"><request><xsl:apply-templates select="response/sql-query-result"/></request></xsl:template><xsl:template match="response/sql-query-result"><get-document><xsl:for-each select="result/row[@pdk and (position() <= $max-count or $max-count=0)]"><document type="{../@type}" dkey="{@pdk}"/></xsl:for-each></get-document></xsl:template></xsl:stylesheet>
Po provedení prvního kroku, kterým je předání požadavku s dotazem pro získání seznamu primárních klíčů, je v druhém kroku realizována transformace, na jejímž výstupu je opět požadavek. Tentokrát je to seznam uzlů get-document pro získání celých instancí kontaktů zavedených v uplynulém týdnu.
Ze vstupních dat uvedených výše tedy díky zobrazené šabloně vznikne následující výstupní XML:
<request type="ok"><get-document><document type="kontakt" dkey="1"/><document type="kontakt" dkey="2"/><document type="kontakt" dkey="3"/><document type="kontakt" dkey="4"/><document type="kontakt" dkey="5"/></get-document></request>
Díky třetí instrukci, kterou je stejně jako u první, perform-request, bude toto xml předáno serveru jako požadavek. Při tvorbě šablon nebo i vkládání obsahu hlavního vstupního uzlu input je třeba dbát na to, aby byly požadavky baleny do uzlu request, tak, jako je to uváděno zde v příkladu.
S šablonou je spojena ještě jeden nástroj, v příkladu rovněž zobrazený a tím je možnost parametrizace použité šablony. V příkladu je použito parametru max-count, který v uvedeném příkadu zajšťuje, je-li uveden, maximální počet požadavků v get-document, není-li uveden, pak se použije výchozí hodnota zadaná v šabloně, kterou je 0 (nula) a v případě nuly není počet požadavků omezován. Aby vše fungovalo jak má, je třeba dodržet při parametrizaci především dvě věci:

pro definici parametrů v šabloně používejte uzly xsl:param a nikoli xsl:variable;

hodnoty parametrů uváděné jako potomky perform-transform nezabalujte nikdy do pomocných apostrofů, jež se v šablonách používají pro vkládání textových hodnot v atributech select a test, zde není třeba texty a čísla odlišovat, XSLT procesor se o správné předání hodnot postará sám;
Po provedení třetího a posledního příkazu (kroku) v požadavku server vrátí výsledek v elementu transform, který sám o sobě je již, stejně jako všechny ostatní odpovědi serveru balen do obálky response. Byl-li posledním příkazem (krokem) příkaz perform-request, je ve výsledném elementu transform uveden další uzel respnse. Byla-li posledním krokem transformace, záleží na výstupu z transformace.

