xsl:merge

Mit Hilfe von xsl:merge können mehrere Input-Dateien zusammengeführt werden. Ein Beispiel kann das Zusammenführen von Fehlerlogs verschiedener Systeme sein.

Die einzelnen Input-Dateien (auch mehrere, verschieden aufgebaute XML-Dateien) werden mit dem xsl:merge-source-Element angegeben.

Beim Zusammenführen der einzelnen Dateien werden die Einträge sortiert. Die Sortierung wird in <xsl:merge-key select="@timestamp"> angegeben.

Wird die Merge-Anweisung im Streaming verwendet, ist die Vorraussetzung, dass alle Input-Dateien bereits vorsortiert sind. Die Möglichkeit, die Input-Dateien vor dem Merge zu sortieren, besteht nicht. Der Versuch nicht vorsortierte Dateien zusammenzuführen, führt zum Abbruch der Transformation.

Im Code-Beispiel Einführungsbeispiel zu xsl:merge (XSLT) wird gezeigt, wie die beiden unterschiedlich aufgebauten Log-Dateien aus den Code-Beispielen Einführungsbeispiel zu xsl:merge (Input 1) und Einführungsbeispiel zu xsl:merge (Input 2) zusammengeführt werden.

Code-Beispiel: Einführungsbeispiel zu xsl:merge (Input 1).

<events>
  <event timestamp="2009-08-20T12:01:01Z">A1 Transaction T1234 started</event>
  <event timestamp="2009-08-20T12:01:08Z">A1 Transaction T1235 started</event>
  <event timestamp="2009-09-20T12:01:12Z">A1 Transaction T1235 ended</event>
  <event timestamp="2009-09-20T12:01:15Z">A1 Transaction T1234 ended</event>
</events>

Input-Datei 1 für das Zusammenführen von Log-Einträgen.

Code-Beispiel: Einführungsbeispiel zu xsl:merge (Input 2).

<log>
  <day>
    <record time="2009-08-20T12:01:01Z">B1 Transaction T1234 started</record>
    <record time="2009-08-20T12:01:08Z">B1 Transaction T1235 started</record>
  </day>
  <day>
    <record time="2009-09-20T12:01:12Z">B1 Transaction T1235 ended</record>
    <record time="2009-09-20T12:01:15Z">B1 Transaction T1234 ended</record>
  </day>
</log>

Anders aufgebaute Input-Datei 2 für das Zusammenführen von Log-Einträgen.

Code-Beispiel: Einführungsbeispiel zu xsl:merge (XSLT).

<xsl:template match="events">
  <Log>
    <xsl:merge> 
      <xsl:merge-source for-each-stream="'../in/Log_A_1.xml', '../in/Log_A_2.xml'" select="/events/event"> 
        <xsl:merge-key select="@timestamp"/>
      </xsl:merge-source> 
      <xsl:merge-source for-each-stream="'../in/Log_B_1.xml'" select="/log/day/record">  
        <xsl:merge-key select="@time"/> 
      </xsl:merge-source> 
      <xsl:merge-action> 
        <xsl:apply-templates select="current-merge-group()"/> 
      </xsl:merge-action> 
    </xsl:merge> 
  </Log> 
</xsl:template>

Beispiel, um die Log-Dateien Log_A_1.xml, Log_A_2.xml und Log_B_1.xml zusammenzuführen. Die beiden "A"-Dateien sind anders als die "B"-Datei aufgebaut.

Zeile 3: Start der xsl:merge-Anweisung.

Zeile 4: Angabe der "A"-Input-Dateien für den Merge.

Zeile 5: Angabe des Merge-Keys, nach welchem die "A"-Input-Dateien vorsortiert sind.

Zeile 7: Angabe der "B"-Input-Datei. Diese Angabe ist nötig, weil die "B"-Datei anders als die "A"-Dateien aufgebaut ist.

Zeile 8: Angabe des Merge-Keys der "B"-Input-Datei.

Zeile 10: Angabe der Aktion, welche mit den zusammengeführten Elementen durchgeführt werden soll.

Zeile 11: Mit current-merge-group() kann das zusammengeführte Element weiterverarbeitet werden.

Übungen zu xsl:merge

   

<< zurück vor >>
Tipp der data2type-Redaktion:
Zum Thema XSLT bieten wir auch folgende Schulungen zur Vertiefung und professionellen Fortbildung an: