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