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