Follow Us on Twitter

XSLT en SOA

November 2008 - Deze Whitebook gaat over het transformeren van XML via XSLT. Beide termen zijn vrij bekend, maar over doel van XSLT bestaat soms nog onduidelijkheid. In dit artikel zullen we een korte introductie geven wat XSLT is en waarvoor het gebruikt kan worden binnen een SOA-omgeving.

Het gebruik van XML voor diverse doeleinden is al lang erg populair. XML biedt een gestructureerde en gestandaardiseerde manier om data formeel te beschrijven. De kracht van XML is dat er zeer veel technieken, standaarden en methodieken zijn om met XML-data om te gaan. XSLT eveneens een standaard binnen de XML-wereld.

XSL, XSLT en XPATH

De meeste standaarden voor XML worden door W3C opgesteld, de organisatie die diverse webstandaarden creëert en bijhoudt. De functie van XSLT is het transformeren van data in een XML-formaat naar data in een ander formaat. Dat andere formaat kan ook op XML gebaseerd zijn maar dat is niet noodzakelijk. De XSL van XSTL komt van eXtended Stylesheet Language. XSL is, niet alleen in naam, vergelijkbaar met stylesheets zoals deze voor opmaak van HTML worden gebruikt. Door opmaak (XSL) en structuur (XML) van data van elkaar los te koppelen, zou met verschillende XSL-stylesheets hetzelfde XML-document gebruikt kunnen worden voor weergave als bijvoorbeeld een PDF-document of een webpagina (HTML).

In het begin van de standaard, was XSL bedoeld om XML-documenten geschikt te maken voor weergave op een scherm of printer. Via een XSL kon een XML-document omgezet worden naar een XML-document met opmaakgegevens, zoals lettertype, pagineren, regelafstand, opmaakcodes als vet of cursief, etc. Dit nieuwe document kon vervolgens weergeven worden op scherm als HTML, PDF-document, Word-document, etc. of naar een printer worden gestuurd. Als snel bleek dat zowel vertalen als definieren van opmaak al snel behoorlijk ingewikkeld te worden, terwijl in een XSL gebruiker alleen een XML-document wilde vertalen naar een nieuw XML-document, niet noodzakelijk voor weergave op scherm. Na suggesties van Microsoft, is de taal door W3C opgesplits in twee talen: XSLT en XSL-FO. XSLT werd de programmeertaal, om XML-documenten te transformeren. XSL-FO werd een taal om opmaak te beschrijven, enigzins vergelijkbaar met CSS. In de volksmond wordt XLS-FO regelmatig XSL genoemd. XSL-FO zal verder in dit document niet behandeld worden.

Tot slot van deze sectie, XPATH is bedoeld om informatie uit XML-documenten te verkrijgen. Het is een querytaal voor XML, vergelijkbaar met wat SQL is voor relationele databases. XPATH is niet uitsluitend bedoeld binnen XSLT maar kan gebruikt worden in elke omgeving en programmeertaal zoals Java. Wie de verschillende Java-libraries voor XML gebruikt, gebruikt al snel ook XPATH. XPATH wordt gebruikt binnen XSLT. XSLT is, zoals gezegd een volledige programmeertaal. Voor Oracle-kenners: in dit opzichte verhoudt XSLT zich tot XPATH zoals PL/SQL zich verhoudt tot SQL. Een belangrijk verschil: in tegenstelling tot PL/SQL is XSLT geen procedurele taal, maar een functionele of declaratieve taal. Later in dit document volgt meer uitleg.

XSLT en SOA

Sinds de opkomst van SOA, Service Oriented Architecture is XML en daarmee XSLT veel belangrijker geworden. In de laatste jaren is SOA, als begrip snel opgekomen en inmiddels ingeburgerd als term. Binnen SOA wordt software gemodelleert als een verzameling services, meestal (maar niet noodzakelijk) webservices die XML-berichten kunnen versturen en ontvangen (2).

Om vervolgens nieuwe functionaliteit te creeren - en SOA van nut te laten zijn, moeten deze webservices met elkaar verbonden worden. Deze webservices kunnen met elkaar verbonden worden via een Enterprise Service Bus, ESB. De ESB ontvangt en verwerkt - consumeert de XML-berichten van een webservice, voert transformaties uit en stuurt het bericht door. De transformaties binnen de ESB worden gemaakt mbv XSLT. De meeste ESB implementaties hebben functionaliteit om via de GUI redelijk eenvoudig deze transformaties te definieren. Zo kunnen in Oracle JDeveloper transformaties tussen berichten gemaakt worden door, in een editor, velden met de muis eenvoudig met elkaar te verbinden.

Helaas worden nog niet alle funtionaliteiten van XSLT door de visuele editor ondersteund en zal de programmeur zelf de XSLT code moeten schrijven. De editor in JDeveloper ondersteund bijvoorbeeld nog geen loops waarmee meerdere voorkomens van een XML-tag kunnen worden doorlopen.

Wanneer de standaardfunctionaliteit van de GUI voor de ESB niet voldoet, kan een programmeur zelf een XSLT programma schrijven. Het XSLT-programma kan een bericht dat door de zendende webservice wordt verstuurd, omzetten naar een bericht dat door de ontvangende webservice verwerkt kan worden. Hieronder wordt deze mechaniek geillustreerd: de service Klantgegevens kan berichten met adresgegevens van klanten versturen. De service mailing gebruikt deze klantgegevens om een mailing te versturen. Het formaat van wat service Klantgegevens verstuurt verschilt echter van wat de service Mailing verwacht, een xslt zorgt ervoor de het adres wordt aangepast.

Alternatief is het schrijven van een nieuw component, feitelijk een nieuwe service, in een taal als Java. Deze kan vervolgens geinstalleerd worden als nieuwe service tussen beide webservices. Voordeel is dat een taal als Java bekender kan zijn voor de ontwikkelaar. Nadeel is dat schrijven van zo'n nieuw component meer complexiteit met zich mee kan brengen, dan alleen het schrijven van een XSLT en deze instellen binnen de ESB.

XSLT-engine

Een XSLT-programma wordt uitgevoerd door een XSLT-engine. Vrijwel elke SOA-omgeving bevat een XSLT-engine. In zo'n geval gaat aanroepen van XSLT transparant via een Enterprise Service Bus. De XSLT engine voert een XSL-programma (of anders gezegd: script) uit met als invoer een XML-document.

XSLT-engines kunnen ook los gebruikt worden. Met name om XSLT-programma's te testen of te analyseren is het bijzonder handig een losse XSLT-engine te kunnen gebruiken, buiten de SOA omgeving om. Een mogelijke command-line XSLT omgeving is Apache Xalan. Met een command-line XSLT omgeving kan een XSLT-bestand gestart worden om op een XML document uitgevoerd te worden (4):

C:\Development\xslt>java -cp C\:utils\xalan-j_2_7_1\xalan.jar  
  org.apache.xalan.xslt.Process 
 
Xalan-J command line Process class options 

Functionele programmeertaal

XSLT is programmeertaal. Nog preciezer gezegd, XSLT is een functionele programmeertaal. Dit laatste verklaart de belangrijkste reden waarom XSLT vaak niet geliefd is, de meeste programmeurs programmeren in een object-georienteerde, procedureleprogrammeertaal als Java.

Programmacode in een procedurele taal bestaat, heel kort gezegd uit, uit regels code die achter elkaar uitgevoerd en variabelen veranderen. Java is ook een OO-taal: de stukken code kunnen gestructureerd worden in classes, maar binnen die classes geldt dit principe nog steeds.

Hoewel vermoedelijk bijna alles lezers in meer of meerdere mate Java kennen, staat hieronder ter illustratie een stuk java code (6). Class structure, main method, etc. is weggelaten:

int factorial ( int number ) { 
  int i, r=1 ; 
  for ( i=1 ; i <= number ; ++i ) { 
    r = r*i ; 
  } 
  return ( r ) ; 
} 

Deze code berekent the factorial van de parameter n. Deze waarde wordt opgeslagen in de variabele r. De variabele wordt aangepast terwijl de for-loop doorlopen wordt.

Hieronder dezelfde functionaliteit, uitgedrukt in XSLT. Uiteraard zal XSLT niet snel gekozen worden om dit soort programma's te schrijven: het illustreert wel wat met XSLT mogelijk is, en wat het verschil is met Java:

<xsl:template name="factorial"> 
 <xsl:param name="number" select="1"/> 
 <xsl:choose> 
   <xsl:when test="$number <= 1"> 
     <xsl:value-of select="1"/> 
   </xsl:when> 
   <xsl:otherwise> 
     <xsl:variable name="recursive_result"> 
       <xsl:call-template name="factorial"> 
         <xsl:with-param name="number" select="$number - 1"/> 
       </xsl:call-template> 
     </xsl:variable> 
     <xsl:value-of select="$number * $recursive_result"/> 
   </xsl:otherwise> 
 </xsl:choose>
</xsl:template> 

In bovenstaande voorbeeld wordt de factorial recursief aangeroepen. De $number parameter wordt telkens doorgegeven. De $number wordt in bovenstaande voorbeeld nergens veranderd: de waarde is een constante.

Later is aan XSLT alsnog de for-loop en variabelen toegevoegd, waardoor XSLT ook enigzins als een imperatieve taal zoals Java gebruikt kan worden. Het gebruik hiervan wordt door verschillende bronnen sterk afgeraden (1): het verwerken van een XML-document wordt aanzienlijk trager. Ook lijkt het gebruik van een for-each in eerste instantie makkelijker, het XSLT-programma als geheel wordt minder begrijpelijk: beter is dan in Java te programmeren, een taal die een stuk bekender is.

Boomstructuur

Ook zeer belangrijke eigenschap van XSLT is, dat de taal niet toegepast wordt direct op een XML-document maar op XML-bomen: XML die door een parser al is verwerkt. In praktijk hoeft hier meestal geen rekening mee gehouden te worden, maar voor begrijpen van XSLT is het belangrijk te onthouden. Een XML document dat syntactisch incorrect is, b.v. met een missende sluit-tag, zal nooit door XSLT verwerkt kunnen worden, de uitvoer van een programma dat incorrecte XML produceert, zal ook nooit door een XSLT-engine verwerkt kunnen worden. Tijdens programmeren in XSLT is het goed aan te denken, dat niet gewerkt wordt op XML-documenten als (ASCII) tekst, maar op XML-documenten als een boomstructuur.

Een voorbeeld

Voordat we verder gaan met de theorie, volgt hieronder een voorbeeld van een XSLT programma. Hieronder staat een voorbeeld van een XML-document (5):

<?xml version="1.0" encoding="UTF-8" ?> 
<customers> 
  <customer> 
    <myName name="Gerbrand"/> 
    <myEmail email="gerbrand@wh.nl"/> 
  </customer> 
  <customer> 
    <myName name="Cyril"/> 
    <myEmail email="cyril@wh.nl"/> 
  </customer> 
</customers>

Stel we willen een nieuw XML document produceren, dat uitsluitend het emailadressen bevat, bij voorbeeld ten behoeve van een mailing(-service):

<?xml version="1.0" encoding="UTF-8" ?> 
<emailaddresses> 
  <emailaddress>gerbrand@wh.nl</emailaddress> 
  <emailaddress>cyril@wh.nl</emailaddress> 
  <emailaddress></emailaddress> 
</emailaddresses> 
 
<xsl:stylesheet version="1.0"> 
  <xsl:template match="myEmail"> 
    <ns1:emailaddresses> 
      <ns1:emailaddress> 
        <xsl:value-of/> 
      </ns1:emailaddress> 
    </ns1:emailaddresses> 
  </xsl:template> 
</xsl:stylesheet> 

Templates

De basisstructuur van een XSLT programma zijn templates. Templates worden toegepast op een element van de boom-structuur van het XML document. Templates kunnen aangeroepen worden door de XSLT-engine. Templates kunnen aangeroepen worden op grond van matching-regels. In het bovenstaande voorbeeld wordt een template uitgevoerd, zodra de processor een tag met de naam myEmail tegenkoment.

De tools

Omdat XSLT een volwaardige programmeertaal is, is het aan te raden ook een volwaardige programmeeromgeving (IDE) te gebruiken. Een zeer bekende 'IDE' voor werken met XML-gerelateerde technieken, waaronder XSLT is XML-Spy. XML-Spy bevat een ingebouwde debugger, om schrijven van XSLT programma's te vereenvoudigen.

Andere bekende XSLT-debugger zijn Oxygen (http://www.oxygenxml.com) en Eclipse in combinatie met XSLT-plugin (http://eclipsexslt.sourceforge.net/). Een goed alternatief is het gebruik van een command-line XSLTC engine, zoals het eerder genoemde Xalan, in combinatie met een goede XML-editor. De programmeur mist echter wel mogelijkheden als debuggin.

Een uitgebreid overzicht van XML-tools is te vinden op de website van W3C: http://www.w3.org/XML/Schema#Tools

Conclusie

De belangrijkste eigenschappen en mogelijkheden XSLt zijn de revu gebaseerd. Voor een goede vaardigheid met XSLT is het zeer aan te raden een goed boek aan te schaffen of anderszins kennis op te doen. XSLT is een volwaardige programmeertaal, wat een krachtig middel kan zijn, mits juist toegepast.

Wanneer verschillende webservices met elkaar moeten communiceren, en wanneer XML-documenten snel vertaald moeten worden, is XSLT een zeer krachtig middel. Programmeren in XSLT vereist een denkwijze dan programmeren in Java. Wanneer veel functionaleit noodzakelijk is, is XSLT snel niet de beste programmeertaal. Door onwennigheid, is kans groter dat de programmeur principes die hij of zij in Java zeer hooghoudt: het hergebruik van code en vermijden van copy&paste en het schrijven van modulaire, gestructureerde code zal laten varen. Kortom, gebruik XSLT waar zeker is dat het gebruik een sterk toegevoegde waarde heeft, met name voor aanpassen van XML-berichten of geschikt maken van XML-documenten voor presentatie.

Referenties

  1. Bertrand Delacrétaz, XSLT and XPath without the pain! 2007
  2. Wikipedia, Service-oriëntatie
  3. W3Schools XSL en W3Schools XSLFO
  4. Doug Tidwell, XSLT, 2nd Edition, O'Reilly,
  5. Johan Jeuring, Het ontwikkelen van XML-tools, 2003
  6. Jared Jackson, Use recursion effectively in XSL, 2002

 

Waardering:
 
Tags:

Reacties

Nieuwe reactie inzenden

De inhoud van dit veld is privé en zal niet openbaar worden gemaakt.

Meer informatie over formaatmogelijkheden

CAPTCHA
Deze vraag is om te testen of u een persoon bent en om spam te voorkomen
Image CAPTCHA
Enter the characters shown in the image.