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

71

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?

Venkat
quelle

Antworten:

90

Es ist nicht sinnvoll, einer Vorlage sowohl einen Namen als auch einen Modus zu geben .

Das nameAttribut identifiziert eine Vorlage vollständig und es dürfen nicht zwei Vorlagen mit demselben Namen und unterschiedlichen Modi vorhanden sein.

Mit dem modeAttribut 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 numElement mit einer Position, die nicht im Formular dargestellt werden kann 3*k +1(wobei kes sich um eine Ganzzahl handelt), von einer Vorlage mit leerem Körper abgeglichen und daher nicht verarbeitet.

Wir möchten jedoch alle numElemente 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 copyModus befinden."

Daher ignorieren wir die ausgewählten numElemente nicht, sondern verarbeiten sie im copyModus und erstellen das tds 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 numKnoten, deren Position nicht dargestellt werden 3*k +1kann, 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 .

Dimitre Novatchev
quelle
Um klar zu sein, was Sie sagen, modeist 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ätte modedynamisch definiert werden können.
Patanjali
@Patanjali, Es gibt andere, bessere Möglichkeiten, die Verarbeitung dynamisch auszuwählen. In XSLT 1.0 oder 2.0 kann man die FXSL-Bibliothek für die funktionale Programmierung mit XSLT verwenden (siehe fxsl.sf.net ). In XPath 3 (XSLT 3.0) kann man Funktionen als Parameter an andere Funktionen übergeben,
dh
Leider beschränke ich mich auf die Verwendung von XSLT 1.0, da dies alles ist, was PHP bietet, und meine Zielgruppe verwendet hauptsächlich cPanel und gemeinsam genutzte Server. Daher können solche Erweiterungen nicht hinzugefügt werden. PHP ermöglicht jedoch das Aufrufen von integrierten und vom Programmierer definierten PHP-Funktionen von XSLT aus, und dies bietet wahrscheinlich eine viel umfangreichere Umgebung, als es Erweiterungen zulassen. Es gibt immer einen Weg, die Arbeit zu erledigen, und Einschränkungen zwingen uns nur dazu, kreativ zu sein.
Patanjali
Dimitre, dass Sie mein Missverständnis aufklären mode.
Patanjali
@Patanjali, FXSL ist keine Erweiterung - es ist in reinem XSLT 1.0 geschrieben. Es gibt separate Versionen - für XSLT 1.0 und für XSLT 2.0.
Dimitre Novatchev
7
<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

Andrew
quelle
1
Dies ist eine Antwort, bei der es sich hauptsächlich um kopierte und eingefügte Informationen aus dem XSLT Pocket Guide handelt. Das OP bat jemanden, es mit Beispielen zu erklären ...
Mark Townsend
1
Die Vorlage als Funktion, das Beispiel hier, zeigt kurz die OO-ähnliche polymorphe Funktion, die als "Telefon" bezeichnet wird. Sie können verschiedene Modi angeben, um verschiedene Telefone anzurufen.
Andrew
Das Problem mit dem Beispiel ist, dass es zwar demonstrieren kann, aber das Wissen erfordert, nach dem Fragen wie die OPs suchen, bevor es verstanden werden kann. Genau aus diesem Grund fand ich viele MS-Dokumentationen nicht hilfreich. Da jedoch nicht modeerläutert wird , wie es verwendet wird , sollte es hier nicht ohne Erklärung angeboten werden.
Patanjali
1

Das modeAttribut ermöglicht mehrere Möglichkeiten zur Verarbeitung derselben XML-Elemente.

Eine Vorlage muss ein matchAttribut haben, wenn sie ein Attribut verwenden möchte. modeSie ist daher nicht für Vorlagen gedacht, die sich namebeim Aufrufen ausschließlich auf das Attribut stützen.

Sie gelten, um xsl:apply-templateszu bestimmen, welche xsl:templates 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- paragraphElement als HTML- pElement zum Anzeigen, aber formzum Bearbeiten rendern .

Dies kann dann zur Anzeige gerendert werden durch:

<xsl:template match="paragraph">
 <p>...</p>
</xsl:template>

die mit paragraphTags 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 paragraphElemente 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:templatefü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!

Patanjali
quelle