Es ist nicht sinnvoll, einer Vorlage sowohl einen Namen als auch einen Modus zu geben.
Das Attribut name
identifiziert eine Vorlage vollständig und es können nicht zwei Vorlagen mit demselben Namen und unterschiedlichen Modi vorhanden sein.
Das Attribut mode
ermöglicht, dass die gleichen Knoten mehrmals mit verschiedenen Modi verarbeitet werden.
Hier ist ein kurzes Beispiel:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="num[position() mod 3 = 1]">
<tr>
<xsl:apply-templates mode="copy" select=
". | following-sibling::*[not(position() >2)]"/>
</tr>
</xsl:template>
<xsl:template match="*" mode="copy">
<td><xsl:value-of select="."/></td>
</xsl:template>
<xsl:template match="num"/>
</xsl:stylesheet>
Wenn diese Transformation auf die folgende XML-Dokument angewendet wird:
<nums>
<num>01</num>
<num>02</num>
<num>03</num>
<num>04</num>
<num>05</num>
<num>06</num>
<num>07</num>
<num>08</num>
<num>09</num>
<num>10</num>
</nums>
Das Ergebnis ist, dass die Zahlen in drei tr
angezeigt (Zeilen), die jeweils drei Spalten enthalten (mit der möglichen Ausnahme der letzten Zeile):
<tr>
<td>01</td>
<td>02</td>
<td>03</td>
</tr>
<tr>
<td>04</td>
<td>05</td>
<td>06</td>
</tr>
<tr>
<td>07</td>
<td>08</td>
<td>09</td>
</tr>
<tr>
<td>10</td>
</tr>
In dieser Transformation kann jedes Element mit num
3*k +1
Position, die in der dargestellten Form nicht (wobei k
eine ganze Zahl ist), wird durch eine Vorlage mit leeren Körpern angepasst und somit nicht verarbeitet wird.
Wir möchten jedoch alle num
Elemente verarbeiten, die die Zellen einer Zeile bilden sollten. Für diese purpuse, verarbeiten wir ihnen die Xslt Anweisung verwendet:
<xsl:apply-templates mode="copy" select=
". | following-sibling::*[not(position() >2)]"/>
was bedeutet: „Sie zu den ausgewählten Knoten Vorlagen nicht anwenden, die normalerweise angewendet werden würde (in keinem Modus), sondern Vorlagen anwenden, die in copy
sind mode“
Somit wir die ausgewählten Elemente num
nicht ignorieren, ohne jedoch deren Verarbeitung in copy
Modus und schaffen die td
s eine Zeile.
Die Template-Regel:
<xsl:template match="num"/>
ist notwendig, die XSLT gebautet Vorlagen (Standardverarbeitung) außer Kraft zu setzen, die ansonsten die Stringwerte der num
Knoten, deren Position als 3*k +1
dargestellt werden, kann nicht ausgegeben werden verursachen würde.
So werden diese Knoten von beiden Vorlagen verarbeitet:
<xsl:template match="num"/>
und
<xsl:apply-templates mode="copy" select=
". | following-sibling::*[not(position() >2)]"/>
und so erhalten wir das gewünschte Ergebnis.
Es wäre lehrreich, einen guten XSLT-Debugger zu durchlaufen, um zu sehen, wie diese Templates angewendet werden.
@ajreal: +1 für nützliches Beispiel. – Venkat
Gute Frage, +1. Siehe meine Antwort für eine Erklärung und für ein vollständiges Codebeispiel. –