
A mellékelt példa használata előtt importálnia kell a Microsoft XML és a Microsoft Word komponenseket. Ennek módja a következő: a Project menüből válasszuk ki az Import Type Library menüpontot. A listában keressük meg a Microsoft XML és Microsoft Word elemeket. A Create Unit gombbal hozzuk létre a unit-okat, amelyekre a programban a uses kulcsszó után hivatkozunk.
XML állomány jellemzői
A példában használandó XML állomány olyan szempontból különleges - bár jobb szó az, hogy ritkábban használt -, hogy a <WareHouse></WareHouse> gyökérelemeken belül két főcsomópontot tartalmaz, és ezek is rendelkeznek három, illetve két gyermekcsomóponttal. Struktúrája egy többdimenziós mátrix-struktúra. Az ilyen struktúrában leképezhetők életszerű összefüggések.
Az állomány két alcsomópontja az <Entries></Entries>, míg ezek gyermekcsomópontjai a <Entry></Entry> tagok között helyezkednek el.
A mellékelt példa mappájában elhelyezett állomány neve WareHouse.xml.
Logika az XSLT állományban
A mellékelt programban egy metódussal feldolgozzuk az XML állományunkat a sémaállományban meghatározott logika alapján. Ez a logika annyit jelent, hogy az XSL vezérlő szerkezetek segítségével végighaladunk valamennyi <Entry></Entry> elemen, és értelmezzük a tagok Type nevű attribútumait, valamint megformázzuk a <Name></Name> és a <Description></Description> elemek közötti szöveget. Amennyiben a formázás kész, akkor a létrejövő kimenetet egy WareHouse.rtf Microsoft Word dokumentumba mentjük.
Az XML állomány bejegyzésein az xsl:for-each szerkezettel haladunk végig:
...
<xsl:template match="/">
<xsl:text>{\rtf1</xsl:text>
<xsl:for-each select="WareHouse/Entries/Entry">
Az XML <Name></Name> tagjai közt található terméknevet BOLD típusúra formázzuk:
<xsl:text>\par\b </xsl:text>
<xsl:value-of select="Name"/>
<xsl:text>\b0\i </xsl:text>
A fenti tagban találunk egy TYPE attribútumot, mely minősítő számot tartalmaz a termékhez, annak mennyiségétől függően. Ezt értelmezve egy meghatározott szöveget illeszt a név mellé ITALIC formázással:
<xsl:if test="Name[@Type='1']">Kritikus mennyiség alatt...</xsl:if>
<xsl:if test="Name[@Type='2']">Elegendő raktárkészlet...</xsl:if>
<xsl:text>\i0\par </xsl:text>
Majd a <Description></Description> tagok közötti elemeket egy sorral lejjebb jeleníti meg normál (alapértelmezett) szöveggel:
<xsl:value-of select="Description"/>
<xsl:text>\par</xsl:text>
</xsl:for-each>
<xsl:text>}</xsl:text>
</xsl:template>
...
Konvertálás
A példa Form-ján megtalálható PageControl három füle alatt egy-egy TMemo kontrolt találunk, melyek közül kettőbe a forrás XML állomány tartalmát, a konverzióhoz szükséges XSLT állományt töltjük be, míg a harmadik kontrolban az eredmény-karakterlánc jelenik meg.
A művelet elvégzése előtt egy-egy objektumba töltjük az XML, és XSLT állományok tartalmát.
XMLDoc := CoDOMDocument.Create;
XSLDoc := CoDOMDocument.Create;
XMLDoc.load(ExtractFilePath(Application.ExeName)+'WareHouse.xml'); XSLDoc.load(ExtractFilePath(Application.ExeName)+'WareHouse.xslt');
Az XMLDOMDocument objektum transformNode metódusának meghívásával konvertálhatjuk az XML-t az XSLT állomány segítségével egy speciális szöveggé, mely formázó elemeket is tartalmaz, így a generált RTF állományban formázva jelenik meg az információ.
Memo3.Text := XMLDoc.transformNode(XSLDoc); Memo3.Lines.SaveToFile(ExtractFilePath(Application.ExeName)+'WareHouse.rtf');
A formázás után programból elindítjuk az MS Word alkalmazást, hogy meggyőződjünk a művelet sikeréről.