wake-up-neo.com

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

Im

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

Was bedeutet mode? Ich habe viele, viele Ressourcen durchsucht, aber ich konnte kein Beispiel dafür finden. Kann das jemand anhand eines Beispiels erklären?

69
Venkat

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

Das name -Attribut kennzeichnet eine Vorlage vollständig und es können nicht zwei Vorlagen mit demselben Namen und verschiedenen Modi vorhanden sein.

Das Attribut mode ermöglicht die mehrfache Verarbeitung eines Knotens in verschiedenen Modi..

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) mit jeweils drei Spalten angezeigt werden (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 in der Form 3*k +1 Dargestellt werden kann (wobei k eine Ganzzahl ist), von einer Vorlage mit leerem Hauptteil und somit abgeglichen wird 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)]"/>

was bedeutet: "Nicht auf die ausgewählten Knotenvorlagen anwenden, die normalerweise angewendet würden (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 die td s einer Zeile.

Die Vorlagenregel:

<xsl:template match="num"/>

ist erforderlich, um die in xslt eingebauten Vorlagen (Standardverarbeitung) zu überschreiben, bei denen andernfalls die Zeichenfolgenwerte der Knoten num ausgegeben werden, deren Position nicht als 3*k +1 dargestellt werden kann.

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 erhalten wir das gewünschte Ergebnis.

Es wäre aufschlussreich, einen guten XSLT-Debugger zu verwenden, um zu sehen, wie diese Vorlagen angewendet werden..

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

6
Andrew Xie