Im
<xsl:template name="temp_name" mode="mode">
Was bedeutet das mode
? Ich habe viele, viele Ressourcen durchsucht, aber ich konnte kein Beispiel dafür finden. Kann jemand mit einem Beispiel erklären?
Antworten:
Es ist nicht sinnvoll, einer Vorlage sowohl einen Namen als auch einen Modus zu geben .
Das name
Attribut identifiziert eine Vorlage vollständig und es dürfen nicht zwei Vorlagen mit demselben Namen und unterschiedlichen Modi vorhanden sein.
Mit dem mode
Attribut können dieselben Knoten in verschiedenen Modi mehrmals 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 Umwandlung auf das 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
(Zeilen) angezeigt werden , 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>
Bei dieser Transformation wird jedes num
Element mit einer Position, die nicht im Formular dargestellt werden kann 3*k +1
(wobei k
es sich um eine Ganzzahl handelt), von einer Vorlage mit leerem Körper abgeglichen und daher nicht verarbeitet.
Wir möchten jedoch alle num
Elemente verarbeiten, die die Zellen einer Zeile bilden sollen. Zu diesem Zweck verarbeiten wir sie mit der Anweisung xslt:
<xsl:apply-templates mode="copy" select=
". | following-sibling::*[not(position() >2)]"/>
Dies bedeutet: "Nicht auf die ausgewählten Knotenvorlagen anwenden, die normalerweise angewendet werden (in keinem Modus), sondern Vorlagen anwenden, die sich im copy
Modus befinden."
Daher ignorieren wir die ausgewählten num
Elemente nicht, sondern verarbeiten sie im copy
Modus und erstellen das td
s einer Zeile.
Die Vorlagenregel:
<xsl:template match="num"/>
ist erforderlich, um die in xslt integrierten Vorlagen (Standardverarbeitung) zu überschreiben, die andernfalls dazu führen würden, dass die Zeichenfolgenwerte der num
Knoten, deren Position nicht dargestellt werden 3*k +1
kann, ausgegeben werden.
Diese Knoten werden also von beiden Vorlagen verarbeitet :
<xsl:template match="num"/>
und
<xsl:apply-templates mode="copy" select=
". | following-sibling::*[not(position() >2)]"/>
und so bekommen wir das gewünschte Ergebnis.
Es wäre lehrreich, einen guten XSLT-Debugger zu verwenden, um zu sehen, wie diese Vorlagen angewendet werden .
mode
.
<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>
Verknüpfen Sie hier ein einfaches Beispiel: https://msdn.microsoft.com/en-us/library/ms256045%28v=vs.110%29.aspx
mode
erläutert wird , wie es verwendet wird , sollte es hier nicht ohne Erklärung angeboten werden.
Das mode
Attribut ermöglicht mehrere Möglichkeiten zur Verarbeitung derselben XML-Elemente.
Eine Vorlage muss ein match
Attribut haben, wenn sie ein Attribut verwenden möchte. mode
Sie ist daher nicht für Vorlagen gedacht, die sich name
beim Aufrufen ausschließlich auf das Attribut stützen.
Sie gelten, um xsl:apply-templates
zu bestimmen, welche xsl:template
s antworten, sodass ein Anruf in einem Modus nur eine Vorlage aufruft, die denselben Modus verwendet. Vorlagen ohne Modus antworten nur auf einen Anruf ohne Modus.
Beispielsweise möchten Sie möglicherweise ein XML- paragraph
Element als HTML- p
Element zum Anzeigen, aber form
zum Bearbeiten rendern .
Dies kann dann zur Anzeige gerendert werden durch:
<xsl:template match="paragraph">
<p>...</p>
</xsl:template>
die mit paragraph
Tags in einem XML-Dokument übereinstimmen würden, wenn sie aufgerufen werden:
<xsl:apply-templates />
Umgekehrt zum Rendern zum Bearbeiten verwenden:
<xsl:template match="paragraph" mode="edit">
<form>...</form>
</xsl:template>
durch anrufen durch:
<xsl:apply-templates mode="edit" />
Beachten Sie, dass im Beispiel, wenn der Rest der Seite im Nicht-Modus gerendert werden soll xsl:apply-templates
, die xsl:template mode="edit"
Version explizit aufgerufen werden muss, damit die spezifischen paragraph
Elemente bearbeitet werden.
Wenn Sie nicht für alle XML-Elemente eine Modusübereinstimmung benötigen, geben Sie eine Nullvorlage an, z.
<xsl:template match="*" mode="edit" />
um sicherzustellen, dass Sie keinen "Phantom" -Text von tiefen Übereinstimmungen erhalten, die die Ausgabe verschmutzen.
Wie bei jeder xsl-Catchall-Vorlage setzen Sie sie xsl:template
für denselben Modus an den Anfang aller s, da xsl die letzte übereinstimmende Vorlage verwendet, und wenn Sie sie zuletzt setzen, wird sichergestellt, dass nie etwas gesehen wird!
mode
ist dies eher ein Filter dafür, welche Vorlagen für die Verarbeitung von Knoten verfügbar sind, als eine der Alternativen für eine bestimmte Vorlage, die von ihrem Namen angenommen werden könnte und welche Art der Nutzung hätte davon profitiert, hättemode
dynamisch definiert werden können.