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:

example
<transform id="test" encode="xml">
<input>
<request>
<sql-query>
<select type="kontakt">SELECT pdk FROM dbo.knt-!- WHERE xc_crdt &gt;= 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:

example
<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:

example
<?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() &lt;= $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:

example
<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.


Identifikace chyb při ukládání XML dokumentůIdentifikace chyb při ukládání XML dokumentůPříklad požadavků na pseudo-dokumentyUkládání pseudo dokumentůEvidence historie změn dokumentůPříklad pro rozpracované dokuementyPřímé SQL dotazy do databázePříklady práce se souboryPříklad XML nastaveníPříklad seznamu naplánovaných úlohPříklad naplánování úlohyPříklad odložení požadavku do-requestPožadavek registerPožadavek register-listPožadavek register-delPříklad transformPříklad spuštění akcePříklad spouštění akcí pomocí zpráv