Text auf eine bestimmte Breite und Ausrichtung umbrechen

(Auszug aus "XSLT Kochbuch" von Sal Mangano)

Problem

Sie wollen mehrzeiligen Text in einem XML-Dokument in ein Format mit fester Breite und Ausrichtung bringen, bei dem die Zeilen am Wortende umbrochen werden sollen.

Lösung

Hier ist eine Lösung, die sowohl den Umbruch als auch das Ausrichten erledigt. Sie verwendet das text:justify-Template, das wir im Rezept Einen in Spalten gesetzten Bericht erzeugen konstruiert haben. Um flexibler zu sein, können Sie es erlauben, die Breite der Ausrichtung getrennt von der Breite des Umbruchs einzustellen, wobei die Breite des Umbruchs als Vorgabewert verwendet wird, wenn keine weitere Angabe erfolgt:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" id="text.wrap" xmlns:str="http://www.ora.com/XSLTCookbook/namespaces/strings" xmlns:text="http://www.ora.com/XSLTCookbook/namespaces/text" exclude-result-prefixes="text">
  <xsl:include href="../strings/str.find-last.xslt"/>
  <xsl:include href="text.justify.xslt"/>
  <xsl:template match="node( ) | @*" mode="text:wrap" name="text:wrap">
    <xsl:param name="input" select="normalize-space( )"/>
    <xsl:param name="width" select="70"/>
    <xsl:param name="align-width" select="$width"/>
    <xsl:param name="align" select=" 'left' "/>
    <xsl:if test="$input">
      <xsl:variable name="line">
        <xsl:choose>
          <xsl:when test="string-length($input) &gt; $width">
            <xsl:call-template name="str:substring-before-last">
              <xsl:with-param name="input" select="substring($input,1,$width)"/>
              <xsl:with-param name="substr" select=" ' ' "/>
            </xsl:call-template>
          </xsl:when>
          <xsl:otherwise>
            <xsl:value-of select="$input"/>
          </xsl:otherwise>
        </xsl:choose>
      </xsl:variable>
      <xsl:if test="$line">
        <xsl:call-template name="text:justify">
          <xsl:with-param name="value" select="$line"/>
          <xsl:with-param name="width" select="$align-width"/>
          <xsl:with-param name="align" select="$align"/>
        </xsl:call-template>
        <xsl:text>&#xa;</xsl:text>
      </xsl:if>
      <xsl:call-template name="text:wrap">
        <xsl:with-param name="input" select="substring($input, string-length($line) + 2)"/>
        <xsl:with-param name="width" select="$width"/>
        <xsl:with-param name="align-width" select="$align-width"/>
        <xsl:with-param name="align" select="$align"/>
      </xsl:call-template>
    </xsl:if>
  </xsl:template>
</xsl:stylesheet>

Die Lösung greift auf das Template str:substring-before-last zurück, das im Rezept Teilstrings vom Ende eines Strings suchen angelegt wurde. Die zugrunde liegende Idee besteht darin, eine Zeile zu extrahieren, die bis zu $width Zeichen enthält, wobei weniger extrahiert werden, wenn die Zeile nicht mit einem Leerzeichen enden würde. Der Rest der Eingabe wird dann rekursiv verarbeitet. Das Komplizierte daran ist, dass Sie beim Auftreten eines Wortes mit $width Zeichen eine Aufteilung dieses Wortes erlauben.

Das folgende Beispiel zeigt, wie Sie eine Textprobe mit Hilfe dieses Rezepts umbrechen und zentrieren können. Es verwendet unterschiedliche Ausrichtungs- und Umbruchbreiten, um die Wirkung dieser Parameter zu demonstrieren:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:text="http://www.ora.com/XSLTCookbook/namespaces/text">
  <xsl:include href="text.wrap.xslt"/>
  <xsl:strip-space elements="*"/>
  <xsl:output method="text"/>
  <xsl:template match="p">
    <xsl:apply-templates select="." mode="text:wrap">
      <xsl:with-param name="width" select="40"/>
      <xsl:with-param name="align" select=" 'center' "/>
      <xsl:with-param name="align-width" select="60"/>
    </xsl:apply-templates>
    <xsl:text>&#xa;</xsl:text>
  </xsl:template>
</xsl:stylesheet>

Eingabe:

<doc>
  <p>Im Zeitalter des Internets wird die Ausgabe von XSL und XSLT deutlich durch Formate wie HTML, XHTML, XML und PDF dominiert. Allerdings wird der gute, alte einfache Text nie aus der Mode kommen, da er sowohl bei den maschinenlesbaren als auch bei den für Menschen lesbaren Formaten das kleinste gemeinsame Vielfache bildet. XML wird für den Import in eine andere Anwendung, die nicht weiß, wie sie XML lesen soll, oder die XML nicht auf die gewünschte Weise interpretiert, oft in Text umgewandelt. Die Textausgabe wird darüber hinaus auch eingesetzt, wenn das Ergebnis an ein Terminal geschickt oder weiterverarbeitet werden soll, etwa in einer Unix-Pipeline.</p>
  <p>Viele Beispiele in diesem Abschnitt konzentrieren sich auf XSLT-Techniken, die generische XML-zu-Text-Konverter erzeugen. Generisch bedeutet hier, dass die Transformationen leicht angepasst werden können, um mit vielen verschiedenen XML-Eingaben zu funktionieren oder um eine Vielzahl von Ausgaben zu produzieren oder beides. Die Techniken, die in diesen Beispielen angewandt werden, können auch über den Rahmen eines der gezeigten Rezepte und oft auch über den Bereich der Textverarbeitung hinaus eingesetzt werden. Dazu sollten Sie sich vor allem die Rezepte 7.2 bis 7.5 anschauen, selbst wenn Sie momentan noch keinen Bedarf für die dargestellten Lösungen sehen.</p>
</doc>

Ausgabe:

                             Im Zeitalter des Internets wird die
                          Ausgabe von XSL und XSLT deutlich
                  durch Formate wie HTML, XHTML, XML und
                  PDF dominiert. Allerdings wird der gute,
                      alte einfache Text nie aus der Mode
                           kommen, da er sowohl bei den
                       maschinenlesbaren als auch bei den
                        für Menschen lesbaren Formaten das
                       kleinste gemeinsame Vielfache bildet.
                    XML wird für den Import in eine andere
                     Anwendung, die nicht weiß, wie sie XML
                      lesen soll, oder die XML nicht auf die
                      gewünschte Weise interpretiert, oft in
                    Text umgewandelt. Die Textausgabe wird
                       darüber hinaus auch eingesetzt, wenn
                     das Ergebnis an ein Terminal geschickt
                         oder weiterverarbeitet werden soll,
                                etwa in einer Unix-Pipeline.

                        Viele Beispiele in diesem Abschnitt
                     konzentrieren sich auf XSLT-Techniken,
                     die generische XML-zu-Text-Konverter
                       erzeugen. Generisch bedeutet hier, dass
                        die Transformationen leicht angepasst
                               werden können, um mit vielen
                             verschiedenen XML-Eingaben zu
                        funktionieren oder um eine Vielzahl von
                         Ausgaben zu produzieren oder beides.
                         Die Techniken, die in diesen Beispielen
                      angewandt werden, können auch über den
                        Rahmen eines der gezeigten Rezepte und
                                oft auch über den Bereich der
                           Textverarbeitung hinaus eingesetzt
                          werden. Dazu sollten Sie sich vor allem
                              die Rezepte 7.2 bis 7.5 anschauen,
                           selbst wenn Sie momentan noch keinen
                            Bedarf für die dargestellten Lösungen
                                                        sehen.

Diskussion

In vielen Textumwandlungsszenarien kann das endgültige Ausgabegerät nicht mit Text beliebiger Zeilenlänge umgehen. Die meisten Geräte (wie etwa Terminals) umbrechen den Text, der über ihren horizontalen Anzeigebereich hinausgeht. Dieser Umbruch hat üblicherweise eine schlampig aussehende Ausgabe zur Folge. Dieses Beispiel erlaubt Ihnen einen intelligenteren Ansatz für eine Formatierung fester Breite.

Siehe auch

Ein ähnliches Template zum Textumbruch können Sie in Jeni Tennisons Buch XSLT and XPath on the Edge (M&T, 2001) finden. In dieser Lösung werden jedoch darüber hinaus Möglichkeiten zur Ausrichtung gezeigt. Außerdem wird der Fall behandelt, dass Wörter länger sind als die gewünschte Breite.

  

<< zurück vor >>

 

 

 

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

Copyright © 2006 O'Reilly Verlag GmbH & Co. KG
Für Ihren privaten Gebrauch dürfen Sie die Online-Version ausdrucken.
Ansonsten unterliegt dieses Kapitel aus dem Buch "XSLT Kochbuch" denselben Bestimmungen, wie die gebundene Ausgabe: Das Werk einschließlich aller seiner Teile ist urheberrechtlich geschützt. Alle Rechte vorbehalten einschließlich der Vervielfältigung, Übersetzung, Mikroverfilmung sowie Einspeicherung und Verarbeitung in elektronischen Systemen.

O'Reilly Verlag GmbH & Co. KG, Balthasarstraße 81, 50670 Köln, kommentar(at)oreilly.de