Beispiel: Orf und Gruppierung
Daten Parsen in XML-Fragment

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], '&#34;', '&#32;')"/>
        </Kategorie>
        <Id>
          <!--Id aus dem Titel des ORF-Records parsen-->
          <xsl:value-of select="iduCore:Replace(iduCore:StringSplit('Id', ., true())[2], '&#34;', '&#32;')"/>
        </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:

Daten gruppieren

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], '&#34;', '&#32;')"/>
        </Kategorie>
        <Id>
          <!--Id aus dem Titel des ORF-Records parsen-->
          <xsl:value-of select="iduCore:Replace(iduCore:StringSplit('Id', ., true())[2], '&#34;', '&#32;')"/>
        </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: