Подтвердить что ты не робот

Можно ли дать мне пример для "режима" шаблона в xsl?

В

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

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

4b9b3361

Ответ 1

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

Атрибут 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 является целым числом), сопоставляется шаблоном с пустым телом и, следовательно, не обрабатывается.

Однако мы хотим обработать все элементы num, которые должны образовывать ячейки строки. Для этого purpuse мы обрабатываем их с помощью инструкции 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, чтобы увидеть, как эти шаблоны применяются.

Ответ 2

<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