Nachfolgend wird ein Puzzle-Dokument mit per ORF verknüpften Ebenen ausgewertet. Besonderheit ist hier, dass der Titel des Orf-Objektes aus mehreren Datenfeldern zusammengesetzt ist, auf welche hier wieder einzeln zugegriffen werden soll.
Beispiel ORF-Objekt-Titel: Kategorie "6" Id "427551"
Daraus sollen Kategorie und Id in aller ORF-Objekte in einer Tabelle angezeigt werden. Dies kann erreicht werden, indem die Titel geparst und in einer Variable als XML-Tree-Fragment zwischengespeichert werden. Anschließend wird dieses Fragment in einer Schleife ausgewertet und in einer Tabelle ausgegeben.
Auszug aus der Transformationsdatei:
<div>Beispieltabelle</div>
<!--Daten aus dem ORF-Titel parsen und ein neues XML-Baum-Fragment zusammensetzen -->
<xsl:variable name="parsedErdwaermeZonen">
<!--OrfStores auf die Ebene L115 (Erdwärmezonen) filtern (Bsp StoreId: DEVELOPERS:LAYERSTORE:115:OBJECTID, 3. Teil ist EbenenId)-->
<xsl:for-each select="/Root/ORFDOCS/ORFSTORE[iduCore:StringSplit(':',STOREID,true())[3] = '115']/RECORD/SOURCE">
<!--Neues XML-Baum-Fragment 'Erdwaermezone'-->
<Erdwaermezone>
<Kategorie>
<!--Kategorie aus dem Titel des ORF-Records parsen (Bsp. für Titel: Kategorie "6" Id "427551") -->
<xsl:value-of select="iduCore:Replace(iduCore:StringSplit('Id', iduCore:StringSplit('Kategorie', ., true())[1], true())[1], '"', ' ')"/>
</Kategorie>
<Id>
<!--Id aus dem Titel des ORF-Records parsen-->
<xsl:value-of select="iduCore:Replace(iduCore:StringSplit('Id', ., true())[2], '"', ' ')"/>
</Id>
</Erdwaermezone>
</xsl:for-each>
</xsl:variable>
<!--Tabelle mit den Datensätzen des neuen XML-Baum-Fragments ausgeben-->
<table class="tabelle">
<!--muss in einen Knotensatz umgewandelt werden, damit per XPath nutzbar-->
<xsl:for-each select="msxsl:node-set($parsedErdwaermeZonen)/Erdwaermezone">
<tr>
<td>Kategorie</td>
<td>
<xsl:value-of select="./Kategorie"/>
</td>
<td>Id</td>
<td>
<xsl:value-of select="./Id"/>
</td>
</tr>
</xsl:for-each>
</table>
Ergebnis als PDF-Ausgabe:
Im zweiten Schritt sollen die ORF-Objekte gruppiert werden nach der Kategorie. Dazu wird eine Liste aller vorkommenden Kategorien erzeugt. Zu dieser werden dann in einer zweiten Schleife alle zugehörigen Ids zusammengesucht.
Auszug aus der Transformation:
<div>Beispieltabelle</div>
<!--Daten aus dem ORF-Titel parsen und ein neues XML-Baum-Fragment zusammensetzen -->
<xsl:variable name="parsedErdwaermeZonen">
<!--OrfStores auf die Ebene L115 (Erdwärmezonen) filtern (Bsp StoreId: DEVELOPERS:LAYERSTORE:115:OBJECTID, 3. Teil ist EbenenId)-->
<xsl:for-each select="/Root/ORFDOCS/ORFSTORE[iduCore:StringSplit(':',STOREID,true())[3] = '115']/RECORD/SOURCE">
<!--Neues XML-Baum-Fragment 'Erdwaermezone'-->
<Erdwaermezone>
<Kategorie>
<!--Kategorie aus dem Titel des ORF-Records parsen (Bsp. für Titel: Kategorie "6" Id "427551") -->
<xsl:value-of select="iduCore:Replace(iduCore:StringSplit('Id', iduCore:StringSplit('Kategorie', ., true())[1], true())[1], '"', ' ')"/>
</Kategorie>
<Id>
<!--Id aus dem Titel des ORF-Records parsen-->
<xsl:value-of select="iduCore:Replace(iduCore:StringSplit('Id', ., true())[2], '"', ' ')"/>
</Id>
</Erdwaermezone>
</xsl:for-each>
</xsl:variable>
<!--Liste aller vorkommenden Kategorien erzeugen-->
<xsl:variable name="distinctKategorien" select="msxsl:node-set($parsedErdwaermeZonen)/Erdwaermezone[not(Kategorie = preceding::Erdwaermezone/Kategorie)]/Kategorie" />
<!--Tabelle gruppiert nach Kategorien erzeugen-->
<table class="tabelle">
<!--Liste der distinct Kategorien durchgehen-->
<xsl:for-each select="$distinctKategorien">
<xsl:sort select="."/>
<tr>
<td>Kategorie</td>
<td>
<xsl:value-of select="."/>
</td>
<td>Ids</td>
<td>
<!--in einer Schleife alle zugehörigen Ids zusammensuchen-->
<xsl:for-each select="msxsl:node-set($parsedErdwaermeZonen)/Erdwaermezone[Kategorie = current()]">
<xsl:value-of select="./Id"/>
</xsl:for-each>
</td>
</tr>
</xsl:for-each>
</table>
Ausgabe im PDF: