Thomas J.S.: push processing und pull processing

Beitrag lesen

... Nachtrag

ad 3) Die Effizienz: for-each "kann" etwas besser sein, denn es vermeidet, dass für ein Elemente erst ein Template gesucht und dann ausgeführt werden muss, aber dieser Effekt dürfte sich erst bei _wirklich_ großen Dokumenten messbar auswirken.

Ich habe interessenhalber mit den Dateien von:
http://aktuell.de.selfhtml.org/tippstricks/xml/gruppierung1/
eine kleine Benchmark gemacht(die for-each Variante des XSL's hänge ich hier unten an):

Ich habe je 10 Versuche gemacht
for-each: Durchschnitt 19ms
http://www.meta-text.net/etc/bm_foreach.gif

apply-templates: Durchschnitt: 25ms
http://www.meta-text.net/etc/bm_applytemplates.gif

Die Zahlen:
1: % der Gesamtzeit kalkuliert im Bezug zum Wurzel (blauer Pfeil) oder zur aufrufenden Anweisung (Uhr)
2: daselbe in µs inkl. Aufruf weiterer Anweisungen
3: % der inhärenten Zeit (zeigt die Zeit die Tatsächlich im Knoten verbraucht wurde) kalkuliert im Bezug zum Wurzel (blauer Pfeil) oder zur aufrufenden Anweisung (Uhr)
4: dasselbe in µs.
x inv.: zeigt wie oft der Knoten aufgerufen wurde bzw. wie oft die anweisung in diesem Teil aufgerufen wurde.

Grüße
Thomas

-------------------------
<?xml version="1.0" encoding="iso-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns="http://www.w3.org/1999/xhtml">
 <xsl:output method="html" encoding="iso-8859-1" doctype-public="-//W3C//DTD XHTML 1.0 Strict//EN" doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd" indent="yes" />

<xsl:key name="participant2event" match="participant" use="id(@events)/@id" />

<xsl:template match="/activity">
  <html>
   <head>
    <meta http-equiv="content-type" content="text/html; charset=iso-8859-1" />
    <title>Veranstaltungen und Teilnehmer</title>
   </head>
   <body>
    <h1>Veranstaltungen und Teilnehmer</h1>
    <h2>Pro Veranstaltung</h2>
    <xsl:for-each select="events/event">
     <h3>
      <xsl:value-of select="@name" />
     </h3>
     <ul>
     <xsl:for-each select="key('participant2event', @id)">
      <li>
       <xsl:value-of select="@name" />
      </li>
     </xsl:for-each>
     </ul>
    </xsl:for-each>
    <hr />
    <h2>Pro Teilnehmer</h2>
    <xsl:for-each select="participants/participant">
     <p>
      <strong><xsl:value-of select="@name" />: </strong>
      <xsl:for-each select="id(@events)">
       <xsl:value-of select="@name" />
       <xsl:if test="position() != last()">, </xsl:if>
      </xsl:for-each>
     </p>
    </xsl:for-each>
   </body>
  </html>
 </xsl:template>
</xsl:stylesheet>