Можно ли привести пример для "режима" шаблона в xsl? - PullRequest
69 голосов
/ 20 декабря 2010

В

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

Что означает mode? Я искал много много ресурсов, но я не мог найти пример для этого. Так может кто-нибудь объяснить на примере?

Ответы [ 2 ]

84 голосов
/ 20 декабря 2010

Не слишком важно давать шаблону и имя, и режим .

Атрибут name полностью идентифицирует шаблон, и не может быть двух шаблонов с одинаковым именем и разными режимами.

Атрибут mode позволяет обрабатывать одни и те же узлы более одного раза, используя разные режимы .

Вот краткий пример:

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

Когда это преобразование применяется к следующему документу XML :

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

В результате числа отображаются в виде трех tr (строк), каждый из которых содержит три столбца (возможно, за исключением последней строки):

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

В этом преобразовании любой элемент num с позицией, которая не может быть представлена ​​в форме 3*k +1 (где k - целое число), сопоставляется с шаблоном с пустым телом и, следовательно, не обрабатывается. 1030 *

Однако мы хотим обработать все элементы num, которые должны образовывать ячейки строки. Для этой цели мы обрабатываем их с помощью инструкции xslt:

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

, что означает: «Не применять к выбранным узлам шаблоны, которые обычно применяются (без режима), но применять шаблоны, находящиеся в режиме copy»

Таким образом, мы не игнорируем выбранные элементы num, а обрабатываем их в режиме copy и создаем td строки.

Шаблонное правило:

<xsl:template match="num"/>

необходимо переопределить встроенные шаблоны xslt (обработка по умолчанию), которые в противном случае приводили бы к выводу строковых значений узлов num, положение которых не может быть представлено как 3*k +1.

Итак, эти узлы обрабатываются обоими шаблонами :

<xsl:template match="num"/>

и

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

и, таким образом, мы получаем желаемый результат.

Было бы полезно поработать с хорошим отладчиком XSLT, чтобы увидеть, как применяются эти шаблоны .

6 голосов
/ 18 мая 2016
<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>

Ссылка на простой пример здесь: https://msdn.microsoft.com/en-us/library/ms256045%28v=vs.110%29.aspx

...