2010-12-20 6 views
60

InKann man mir das Beispiel für "Modus" der Vorlage in xsl geben?

<xsl:template name="temp_name" mode="mode"> 

Was ist die Bedeutung von mode ist? Ich habe viele viele Ressourcen durchsucht, aber dafür konnte ich kein Beispiel finden. Kann jemand das mit einem Beispiel erklären? Danke im Voraus.

+0

@ajreal: +1 für nützliches Beispiel. – Venkat

+0

Gute Frage, +1. Siehe meine Antwort für eine Erklärung und für ein vollständiges Codebeispiel. –

Antwort

71

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

+1

schönes beispiel, leicht verständlich in schritt für schritt, vielen dank. – Venkat

+0

Ausgezeichnet, ich habe die Modi nie wirklich verstanden, bevor ich deine Antwort gelesen habe. Ich wünschte, ich könnte zweimal dafür stimmen. –

+0

Wirklich ein ausgezeichnetes Beispiel, sehr ähnliche Anforderung Ich muss Daten in Gruppe von 3 Spalten pro Zeile formatieren. – Shaggy

4

In objektorientierten (OO) Termen ist xsl: apply-templates wie eine Funktion, die über eine Liste von Objekten (Knoten) iteriert und für jedes Objekt die gleiche polymorphe Funktion aufruft. Jede Vorlagenregel in Ihrem Stylesheet definiert eine andere Implementierung dieser einzelnen polymorphen Funktion. Welche Implementierung gewählt wird, hängt von den Laufzeiteigenschaften des Objekts (Knotens) ab. Unterstützt die OO-Analogie, Ein Modus-Name identifiziert, welche polymorphe Funktion wiederholt in einem Aufruf an xsl: apply-templates.

<xsl:apply-templates select="phone" /> 
<xsl:apply-templates select="phone" mode="accountNumber"/> 
<xsl:template match="phone"> 
     <TD>A</TD> 
</xsl:template> 
<xsl:template match="phone" mode="accountNumber"> 
     <TD>B</TD> 
</xsl:template> 

Link a einfaches Beispiel hier: https://msdn.microsoft.com/en-us/library/ms256045%28v=vs.110%29.aspx

+0

Dies ist eine Antwort, die hauptsächlich Informationen aus dem XSLT Pocket Guide kopiert und eingefügt wird. Das OP bat jemanden, es mit Beispielen zu erklären ... –

+0

Die Vorlage als eine Funktion, das Beispiel zeigt hier kurz die OO-ähnliche polymorphe Funktion, die als "Telefon" bezeichnet wird. Sie können verschiedene Modi geben, um verschiedene Telefone anzurufen. –

Verwandte Themen