XSL

Aus Fachinformatiker Azubi
Zur Navigation springen Zur Suche springen

XSL dient zur Transformation von XML-Dokumenten. XSL ist ein Programmiersprache und man kann mittels XSL fast jede Ausgabe generieren (PDF, PNG usw.).

Aufbau

A4

Eine gewöhnliche A4 Vorlage für die Pdf Ausgabe.

Die A4 hat die Größe 210mm x 297mm.

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.1" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format" exclude-result-prefixes="fo">
  <xsl:output method="xml" version="1.0" omit-xml-declaration="no" indent="yes"/>
  <xsl:param name="versionParam" select="'1.0'"/> 
  <xsl:template match="users">
    <fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format">
      <fo:layout-master-set>
        <fo:simple-page-master master-name="simpleA4" 
          margin-right="1cm"
          margin-left="1cm"
          margin-bottom="1cm"
          margin-top="1cm"
          page-width="21cm"
          page-height="29.7cm">
	<fo:region-body margin-top="2.7cm" margin-bottom="0.5cm"/>
        <fo:flow flow-name="xsl-region-body">

        <!-- inhalt -->

        </fo:flow>
      </fo:page-sequence>
    </fo:root>
  </xsl:template>
</xsl:stylesheet>

A5

Die A5 hat die Größe 210mm x 148mm.

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.1"
	xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format"
	exclude-result-prefixes="fo">
	<xsl:output method="xml" version="1.0" omit-xml-declaration="no"
		indent="yes" />
	<xsl:param name="versionParam" select="'1.0'" />
	<xsl:template match="berichte">
		<fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format">
			<fo:layout-master-set>
				<fo:simple-page-master master-name="simpleA5"
					margin-right="1cm" margin-left="1cm" margin-bottom="3.5cm"
					margin-top="1cm" page-width="21cm" page-height="148mm">
					<fo:region-body margin-top="1.6cm" />
					<fo:region-before extent="0cm" />
					<fo:region-after />
				</fo:simple-page-master>
			</fo:layout-master-set>
			<fo:page-sequence master-reference="simpleA5">
...

Logo auf jeder Seite

  • Man definiert einen zusätzlichen Bereich.
  • In diesem Bereich gibt man Statischen Inhalt aus.
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.1" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format" exclude-result-prefixes="fo">
  <xsl:output method="xml" version="1.0" omit-xml-declaration="no" indent="yes"/>
  <xsl:param name="versionParam" select="'1.0'"/> 
  <xsl:template match="users">
    <fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format">
      <fo:layout-master-set>
        <fo:simple-page-master master-name="simpleA4" 
          margin-right="1cm"
          margin-left="1cm"
          margin-bottom="1cm"
          margin-top="1cm"
          page-width="21cm"
          page-height="29.7cm">
	<fo:region-body margin-top="2.7cm" margin-bottom="0.5cm"/>
	<fo:region-before extent="1cm"/>
        </fo:simple-page-master>
      </fo:layout-master-set>
      <fo:page-sequence master-reference="simpleA4">

    <fo:static-content flow-name="xsl-region-before">

	<fo:block text-align="right">
		<fo:external-graphic src="/home/user/logo.png" content-width="6cm" content-height="2cm" />
	</fo:block>

    </fo:static-content>

   <fo:flow flow-name="xsl-region-body">

        <!-- inhalt -->

        </fo:flow>
      </fo:page-sequence>
    </fo:root>
  </xsl:template>
</xsl:stylesheet>

Seiteangabe auf jeder Seite

  • Man definiert einen zusätzlichen Bereich.
  • In diesem Bereich gibt man Statischen Seiten Inhalt aus.
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.1" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format" exclude-result-prefixes="fo">
  <xsl:output method="xml" version="1.0" omit-xml-declaration="no" indent="yes"/>
  <xsl:param name="versionParam" select="'1.0'"/> 
  <xsl:template match="users">
    <fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format">
      <fo:layout-master-set>
        <fo:simple-page-master master-name="simpleA4" 
          margin-right="1cm"
          margin-left="1cm"
          margin-bottom="1cm"
          margin-top="1cm"
          page-width="21cm"
          page-height="29.7cm">
	<fo:region-body margin-top="2.7cm" margin-bottom="0.5cm"/>
	<fo:region-after extent="0cm"/>
        </fo:simple-page-master>
      </fo:layout-master-set>
      <fo:page-sequence master-reference="simpleA4">

      <fo:static-content flow-name="xsl-region-after">
	<fo:block font-size="10pt" text-align="center">
		<xsl:text>Seite </xsl:text>
		<fo:page-number/>
		<xsl:text> von </xsl:text>
		<fo:page-number-citation ref-id="LASTPAGE"/>
	</fo:block>
    </fo:static-content>

   <fo:flow flow-name="xsl-region-body">

        <!-- inhalt -->

<fo:block id="LASTPAGE"/>	
        </fo:flow>
      </fo:page-sequence>
    </fo:root>
  </xsl:template>
</xsl:stylesheet>

Tabele mit unterschiedlicher Hintergrundfarben

  • Damit in jeder Tabellenzeile eine unterschiedlich Hintergrundfarbe existiert, muss man mit IF und Modulo arbeiten.
  • Mithilfe der nächsten Beispielen sollte nachvollziehbar sein. Wie man eine Tabelle erstellt mit abwechselnden Hintergrund.

Beispiel Table

<fo:table line-height="20pt" width="100%">

<fo:table-column />
<fo:table-column />

<fo:table-header>
	<fo:table-row>
		<fo:table-cell>
			<fo:block>Person</fo:block>
		</fo:table-cell>
		<fo:table-cell>
			<fo:block>E-Mail</fo:block>
		</fo:table-cell>
	</fo:table-row>
</fo:table-header>

<fo:table-body>
	<fo:table-row >
		<fo:table-cell>
			<fo:block><xsl:value-of select="lastName"/>, <xsl:value-of select="firstName"/></fo:block>
		</fo:table-cell>
		<fo:table-cell>
			<fo:block><xsl:value-of select="email"/></fo:block>
		</fo:table-cell>
	</fo:table-row>
</fo:table-body>

</fo:table>			

Beispiel IF

Es werden nur Postionen Ausgegeben mit dem Modulo-Wert eins. Jeder zweiter Datensatz, wird mit dieser Abfrage ausgegeben.

<xsl:if test="position()mod 2=1">
 <!-- Ausgabe -->
</xsl:if>

Beispiel IF/ELSE

<xsl:choose>
  <xsl:when test="position()mod 2=1">
     <!-- Ausgabe -->
  </xsl:when>
  <xsl:otherwise>
     <!-- Ausgabe -->
  </xsl:otherwise>
</xsl:choose>

Beispiel foreach Ausgabe

<fo:table-body>

	<xsl:for-each select="user">

	<fo:table-row>
		<fo:table-cell>
			<fo:block><xsl:value-of select="lastName"/>, <xsl:value-of select="firstName"/></fo:block>
		</fo:table-cell>
		<fo:table-cell>
			<fo:block><xsl:value-of select="email"/></fo:block>
		</fo:table-cell>
	</fo:table-row>

	</xsl:for-each>

</fo:table-body>

Funktionen

Checkbox

Um eine Checkbox in XSL darzustellen, hat man zwei Möglichkeiten.

  1. Man benutzt Bild Dateien
  2. Man benutzt eine andere Schriftart
Schriftart

Ausgecheckt:

<fo:inline font-family="ZapfDingbats" font-size="10pt">&#x274F;</fo:inline>

Eingecheckt:

<fo:inline font-family="ZapfDingbats" font-size="6pt" border="1pt black solid">&#x2715;</fo:inline>

IF Abfrage

Beim XSL hat man mehrere Möglichkeiten Abfragen zu generieren. Man kann größer sowie kleiner Verwenden. Ebenso auf Gleichheit Prüfen. Ein IF-Abrage gilt in der Programmierung als eine Art IF sowie Switch Abfrage. Das bedeutet man kann nach einem Wert Prüfen. Nach mehreren Werten und Default Wert eingeben. Wenn alles nicht zutrifft wird der Default Wert benutzt.

Beispiel

Hier wird der Wert Beruf aus der XML gehollt und mit dem String Fachinformatiker verglichen.

<fo:block>
 <xsl:choose>
  <xsl:when test="Beruf = 'Fachinformatiker'">
    <xsl:text>Wahr</xsl:text>
  </xsl:when>
  <xsl:otherwise>
    <xsl:text>Falsch</xsl:text>
  </xsl:otherwise>
 </xsl:choose>
</fo:block>

Schleife

Eine schleife eignet sich vor allem in für Tabellen sehr gut.

<xsl:for-each select="bericht">
</xsl:for-each>

Seitenumbruch

Manchmal möchte man einen Seitenumbruch manuell generieren. Dazu fügt man diesen Code in einem Element ein.

break-after="page"

Das könnte dann ungefähr so aussehen:

<fo:block border-bottom="1px solid black" margin-top="0.6cm" break-after="page">
  <xsl:text>Das ist das Ende</xsl:text>
</fo:block>