Durchführen eines Postorder Traversal

(Auszug aus "XSLT Kochbuch" von Sal Mangano)

Problem

Sie wollen rekursiv zuerst die Kinder eines Elements und dann das Element selbst verarbeiten.

Lösung

Lösungen zu diesem Rezept weisen die folgende allgemeine Form auf:

<xsl:template match="node( )">
  <!--Verarbeiten der Kinder -->
  <xsl:apply-templates/>
  <!-- Irgendetwas mit dem aktuellen Knoten tun -->
</xsl:template>

Diskussion

Der Begriff Postorder (Postordnung) ist ein Begriff aus der Informatik für das Durchlaufen eines Baums, und zwar so, dass Sie rekursiv zuerst die Kinder der Wurzel in Postordnung und dann die Wurzel selbst besuchen. Dieser Algorithmus erzeugt ein Stylesheet, das die äußersten Blattknoten verarbeitet und sich dann nach oben zur Dokumentenwurzel hinaufarbeitet.

Sie können ein Postorder Traversal auf das Organigramm (orgchart.xml) anwenden, um zu erklären, wer wem Bericht erstattet, wobei Sie unten beginnen, wie im folgenden Beispiel demonstriert wird. Das darauffolgende Beispiel zeigt die Ausgabe.

Beispiel: Stylesheet.

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="text"/>
  <xsl:strip-space elements="*"/>
  <xsl:template match="/employee" priority="10">
    <xsl:apply-templates/>
    <xsl:value-of select="@name"/><xsl:text> ist der Chef des Unternehmens. </xsl:text>
    <xsl:call-template name="reportsTo"/>
    <xsl:call-template name="HimHer"/> <xsl:text>. </xsl:text>
    <xsl:text>&#xa;&#xa;</xsl:text>
  </xsl:template>
  <xsl:template match="employee[employee]">
    <xsl:apply-templates/>
    <xsl:value-of select="@name"/><xsl:text> ist ein Manager. </xsl:text>
    <xsl:call-template name="reportsTo"/>
    <xsl:call-template name="HimHer"/> <xsl:text>. </xsl:text>
    <xsl:text>&#xa;&#xa;</xsl:text>
  </xsl:template>
  <xsl:template match="employee">
    <xsl:text>Niemand berichtet </xsl:text>
    <xsl:value-of select="@name"/><xsl:text>. &#xa;</xsl:text>
  </xsl:template>
  <xsl:template name="HimHer">
    <xsl:choose>
      <xsl:when test="@sex = 'male' ">
        <xsl:text>ihm</xsl:text>
      </xsl:when>
      <xsl:otherwise>
        <xsl:text>ihr</xsl:text>
      </xsl:otherwise>
    </xsl:choose>
  </xsl:template>
  <xsl:template name="reportsTo">
    <xsl:for-each select="*">
      <xsl:choose>
        <xsl:when test="position() &lt; last() 1 and last() &gt; 2">
          <xsl:value-of select="@name"/><xsl:text>, </xsl:text>
        </xsl:when>
        <xsl:when test="position() = last() - 1 and last() &gt; 1">
          <xsl:value-of select="@name"/><xsl:text> and </xsl:text>
        </xsl:when>
        <xsl:when test="position() = last() and last() = 1">
          <xsl:value-of select="@name"/><xsl:text> berichtet </xsl:text>
        </xsl:when>
        <xsl:when test="position() = last()">
          <xsl:value-of select="@name"/><xsl:text> berichten </xsl:text>
        </xsl:when>
        <xsl:otherwise>
          <xsl:value-of select="@name"/>
        </xsl:otherwise>
      </xsl:choose>
    </xsl:for-each>
  </xsl:template>
</xsl:stylesheet>

Beispiel: Ausgabe.

Niemand berichtet Phill McKraken.
Niemand berichtet Betsy Ross.
Ima Little ist ein Manager. Betsy Ross berichtet ihr.

Nancy Pratt ist ein Manager. Phill McKraken und Ima Little berichten ihr.

Niemand berichtet Walter H. Potter.
Niemand berichtet Craig F. Frye.
Niemand berichtet Hardy Hamburg.
Niemand berichtet Rich Shaker.
Wendy B.K. McDonald ist ein Manager. Craig F. Frye, Hardy Hamburg und Rich Shaker berichten ihr.
Jane Doe ist ein Manager. Walter H. Potter und Wendy B.K. McDonald berichten ihr.

Niemand berichtet Allen Bran.
Niemand berichtet Frank N. Berry.
Niemand berichtet Jack Apple.
Cindy Post-Kellog ist ein Manager. Allen Bran, Frank N. Berry und Jack Apple berichten ihr.

Niemand berichtet R.P. McMurphy.
Jack Nicklaus ist ein Manager. R.P. McMurphy berichtet ihm.

Niemand berichtet Forrest Gump.
Niemand berichtet Andrew Beckett.
Tom Hanks ist ein Manager. Forrest Gump und Andrew Beckett berichten ihm.

Niemand berichtet Helen Prejean.
Susan Sarandon ist ein Manager. Helen Prejean berichtet ihr.

Oscar A. Winner ist ein Manager. Jack Nickolas, Tom Hanks und Susan Sarandon berichten ihm.

Mike Rosenbaum ist ein Manager. Cindy Post-Kellog und Oscar A. Winner berichten ihm.

Jil Michel ist der Chef des Unternehmens. Nancy Pratt, Jane Doe und Mike Rosenbaum berichten ihr.

  

<< 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