Rozšíření o substepy
Výchozí struktura nastavení akcí je rozšířena takto:
<action-steps>
<action-step> (+)
<apply-to ...=""/> (*)
<substep @...=""> (+)
<input @...="">...</input> (+)
</substep>
</action-step>
</action-steps>
Toto rozšíření je základem pro obsluhu služeb. Pro soap tedy není podstatné, až na pár vyjmenovaných výjimek, nastavení kroku step, ale nastavení jednotlivých substep uzlů. Důležité je, že ne každý action-step má transformační význam. V nastaveních action-steps jsou některé kroky jako zadávací, které se poznají podle atributů input-only a input-and-apply, ale hlavně pak podle toho, že nemají mít žádné uzly substep. Právě existence těchto uzlů je pro zpracování na serveru určující.
Popis substepu je následující:
substep
input (+)
@from = {#stepNo}-{#substepNo} | content
@temp = {file-name}.xsl
@temp-form = {file-name}.xsl
@send = true | false
@status = true | false
@avoid-response-check = true | false
@skip-empty = true | false
Uzel substep je vždy o transformaci. Vždy jde o transformaci XML to XML, kde výstupní XML musí být vždy platné, tj. obsahovat alespoň kmenový uzel. V opačném případě je to považováno za chybu serveru (viz. kategorizace v řešení chyb).
Vstup do transformace je dán uzlem input (viz. popis dále), provedení transformace je dáno šablonou v souboru umístěném ve složce buildu, jehož název je obsahem atributu @temp. Pokud jde však o volání typu form (viz. popis existence služby), je třeba použít šablonu uvedenou v atributu @temp-form. Je to jediné místo, kde má typ volání vliv.
Výstupem ze substepu je buď přímo výsledek transformace (@send = false) nebo až odpověď serveru (@send = true) - na server flexideo je v tomto případě odesílán výstup z transformace jako požadavek v obálce request. Je zaručeno, že uzel request je v takovém případě vždy uveden a to jako kmenový uzel XML vystupujícího z transformace. Ošetření prázdného uzlu request, prázdné odpovědi nebo chyby v odpovědi ze serveru viz. řešení chyb.
Každá transformace definovaná uzlem substep může obsahovat mechanismus kontroly založený na uvedení atributu status u kmenového uzlu výsledku. Atribut @status=true indikuje výskyt tohoto mechanismu v transformaci a je třeba ověřovat aplikační status. V případě, že @status není uveden nebo obsahuje false, není kontrola prováděna (více viz. řešení chyb).
Další potenciální chybou je prázdný výsledek. Pokud je na výstupu prázdný kmenový tag, dojde k vyvolání chyby, pokud v uzlu substep není uvedeno @skip-empty=true.
Pro správné ošetření chyby má specifický význam atribut avoid-response-check. Toto nastavení má význam pouze u substepů, kde je výstup z transformace odesílán na server, tedy při nastavení send='true'. Server v takovém případě totiž automaticky zjišťuje, zda v jeho odpovědi na požadavek vystupující z transformace nenastala chyba a pokud ano, generuje sám soap:Fault odpověď klientovi. To je samozřejmě dobré až do chvíle, kdy nastane potřeba bližší identifikace vznnikajících chyb a její předávání klientovi. Ten automatický soap:Fault je totiž jen velmi obecný. Nastavení avoid-response-check='true' zajistí vypnutí této obecné kontroly a poskytne tak prostor pro specializovanou kontrolu odpovědi serveru dalším substepem. Tj. při vypnutí automatické kontroly pomocí avoid-response-check by měl následovat další substep, jehož vstupem bude právě výstup z předchozího a šablona bude uzpůsobena jeho kontrole. Tento další návazný substep by pak měl mít nastaven status='true', aby v případě, že šablona identifikuje chybu mohla tuto skutečnost zaznamenat do kmenového atributu status výstupního XML a bližší popis pak mohl být zabalen do výstupu prostřednictvím soap-error.xsl, kterou server následně při nalezení error hodnoty ve statusu použije. Při tvorbě soap-error.xsl pak většinou stačí jen importovat stejnojmennou šablonu v nadřazené složce _transforms.