XSL: Transformation mit Saxon (java)

Lernziel

Wenn Sie die Station durchgearbeitet haben, wissen Sie, wie Sie mit einem externen Prozessor arbeiten.

Handlungsanweisungen

Aufgaben
  1. Erstellen Sie mit saxon eine HTML-Datei. Benutzen Sie dazu die XML und die XSL aus der vorherigen Station.

  2. Entwickeln Sie bitte eine XSL-Datei, die eine CSV-Datei generieren soll. Benutzen Sie bitte saxon, so dass Sie die CSV-Datei ohne den im Browser integriertem Transformators erstellen. Laden Sie dann die CSV-Datei in Excel ein. Weitere Hinweise finden Sie unten in dieser Station. Benutzen Sie folgende XML-Datei.

<telefon>
  <eintrag>
    <nummer>0331-2345322</nummer>
    <name>Heinz Becker</name>
    <info>Chef</info>
  </eintrag>
  <eintrag>
    <nummer>0331-2345324</nummer>
    <name>Steffi Acht</name>
    <info>Admin</info>
  </eintrag>
</telefon>
  1. Sie bekommen den Auftrag eine Telefonbuch-XML-Datei für Ihr in der Firma verwendetes System anzupassen. Da Ihr System nur eine bestimmte XML-Struktur verwendet, müssen Sie die Telefonbuch-XML-Datei in das passende Format transformieren. Schreiben Sie dazu eine XSL-Datei und führen Sie die Transformation mit saxon durch.

    Ausgangs-XML:

    <telefon>
      <eintrag>
        <nummer>0331-2345322</nummer>
        <name>Heinz Becker</name>
        <info>Chef</info>
      </eintrag>
      <eintrag>
        <nummer>0331-2345324</nummer>
        <name>Steffi Acht</name>
        <info>Admin</info>
      </eintrag>
    </telefon>
    

    Ziel-XML für das firmeneigene System:

    <phonebook>
      <person name="Heinz Becker">
       <desc>Chef</desc>
        <number>0331-2345322</number>
      </person>
      <person name="Steffi Acht">
        <desc>Admin</desc>
        <number>0331-2345324</number>
      </person>
    </phonebook>
    

    Setzen Sie die Output-Methode auf “xml”. Vor dem ersten Template in der XSL-Datei.

CSV-Dateien erstellen

Um CSV-Dateien zu erstellen, müssen Sie folgene Hinweise berücksichtigen:

Output-Methode setzen

<xsl:output method="text" />

Wir müssen die Output-Methode von XSL-Dateien auf „text“ setzen. Die Zeile müssen Sie vor das erste Template setzen.

Whitespaces (Zeilenumbrüche, Tabstopps usw.) in der XML ignorieren

<xsl:strip-space elements="*" />

Vorhandene Zeilenumbrüche, Tabstopps usw., die in der XML-Datei zwischen den Elementen als Strukturierung dienen, sollen nicht in die CSV-Datei übernommen werden. Diese würden ja die Struktur der CSV-Datei zerstören. Um das zu umgehen, können Sie in der XSL-Datei vor dem ersten Template angeben, dass diese sog. Whitespaces ignoriert werden sollen.

Der Stern bedeutet, dass alle Whitespaces in der XML ignoriert werden. Wenn Sie nur Whitespaces innerhalb eines Elementes ignorieren wollen, so können Sie es direkt angeben.

Zeilenumbruch und Datentrenner (Semikolon, Doppelkreuz, Tabstopps) in der XSL generieren

Um die Daten in der CSV voneinander zu trennen, muss zwischen den Daten ein Datentrenner ausgegeben werden, z.B. ein Semikolon, ein Tappstopp oder ein Doppelkreuz. .. index:: Tabstopp, Tabulator Tabulator:

<xsl:text>&#x9;</xsl:text>

Doppelkreuz:

<xsl:text>#</xsl:text>

Einzelne Datensätze werden durch einen Zeilenumbruch voneinander getrennt:

<xsl:text>&#xA;</xsl:text>

oder

<xsl:text>
</xsl:text>

Die XSL-Datei, mit der Sie beginnen können, die Aufgabe oben zu lösen, könnte so aussehen:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <!--Text ausgeben-->
  <xsl:output method="text"/>
  <xsl:strip-space elements="*"/>
  <!--CSV-Datei  generieren-->
  <xsl:template match="telefon">
    <!--HIER GEHT ES LOS-->
  </xsl:template>
</xsl:stylesheet>

Bedenken Sie, dass Zeilenumbrüche in der XSL-Datei auch Zeilenumbrüche in der CSV-Datei werden, d.h. Wenn Sie Sie das umgehen wollen, müssen Sie die XSL-Elemente im entsprechenden Template hintereinander schreiben (auch wenn es nicht besonders lesbar aussieht).

Letze Zeil der XML-Datei erreicht

Wann der letzte Eintrag in der XML-Datei erreicht wurde:

<xsl:if test="position()=last()"><!--MACHE ETWAS--></xsl:if>

Die Lösung, fall sie nicht zum Ziel gelangen:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
     xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <!--Text ausgeben-->
  <xsl:output method="text"/>
  <xsl:strip-space elements="*"/>
  <!--CSV-Datei mit Saxon generieren-->
  <xsl:template match="telefon">
    <xsl:apply-templates select="eintrag"/>
  </xsl:template>
  <xsl:template match="eintrag"><xsl:value-of select="nummer"/>;
    <xsl:value-of select="name"/>;
    <xsl:value-of select="info"/>;
    <xsl:if test="position()!=last()">
      <xsl:text>&#xA;</xsl:text>
    </xsl:if>
  </xsl:template>
</xsl:stylesheet>