Czy można podać przykład" mode " szablonu w xsl?

W

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

Jakie jest znaczenie mode? Przeszukałem wiele zasobów, ale nie mogłem znaleźć na to przykładu. Czy ktoś może wyjaśnić przykładem? Z góry dzięki.

 64
Author: Venkat, 2010-12-20

2 answers

Nie jest zbyt sensowne nadawanie szablonowi zarówno nazwy, jak i trybu .

Atrybut name w pełni identyfikuje szablon i nie mogą istnieć dwa szablony o tej samej nazwie i różnych trybach.

Atrybut mode pozwala na przetworzenie tych samych węzłów więcej niż jeden raz, przy użyciu różnych trybów .

Oto krótki przykład:

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

Gdy ta transformacja jest stosowana na następującym XML dokument :

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

W rezultacie liczby są wyświetlane w trzech tr (wiersze), z których każdy zawiera trzy kolumny (z możliwym wyjątkiem ostatniego wiersza):

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

W tej transformacji każdy num element o pozycji, który nie może być reprezentowany w postaci 3*k +1 (gdzie k jest liczbą całkowitą), jest dopasowany przez szablon z pustym ciałem i dlatego nie jest przetwarzany.

Chcemy jednak przetworzyć wszystkie num elementy, które powinny tworzyć komórki rzędu. W tym celu przetwarzamy je za pomocą instrukcji xslt:

<xsl:apply-templates mode="copy" select=
 ". | following-sibling::*[not(position() >2)]"/>

Co oznacza: "nie stosuj do wybranych szablonów węzłów, które normalnie byłyby stosowane (w trybie no), ale zastosuj szablony, które są w trybie copy" {23]}

Dlatego nie ignorujemy wybranych elementów num, lecz przetwarzamy je w trybie copy i tworzymy td s wiersza.

Reguła szablonu:

<xsl:template match="num"/>

Jest konieczne, aby nadpisać XSLT wbudowane szablony (domyślne przetwarzanie), które w przeciwnym razie spowodowałyby wyjście wartości łańcuchów num węzłów, których pozycja nie może być reprezentowana jako 3*k +1.

Tak więc te węzły są przetwarzane przez oba szablony :

<xsl:template match="num"/>

I

<xsl:apply-templates mode="copy" select=
 ". | following-sibling::*[not(position() >2)]"/>

I w ten sposób otrzymujemy pożądany rezultat.

Byłoby pouczające, aby przejść przez dobry debugger XSLT, aby zobaczyć, jak te szablony są stosowane.

 75
Author: Dimitre Novatchev,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-12-20 06:59:09
<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>

Podlinkuj prosty przykład tutaj: https://msdn.microsoft.com/en-us/library/ms256045%28v=vs.110%29.aspx

 4
Author: Andrew Xie,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-04-04 04:24:37