В
<xsl:template name="temp_name" mode="mode">
В чем смысл mode
? Я искал много много ресурсов, но я не мог найти пример для этого. Так может кто-нибудь объяснить на примере?
В
<xsl:template name="temp_name" mode="mode">
В чем смысл mode
? Я искал много много ресурсов, но я не мог найти пример для этого. Так может кто-нибудь объяснить на примере?
Не имеет смысла указывать шаблон как имени, так и режиму.
Атрибут 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, чтобы увидеть, как эти шаблоны применяются.
<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