Можно ли привести мне пример для" режима " шаблона в xsl?
на
<xsl:template name="temp_name" mode="mode">
что означает mode
? Я искал много много ресурсов, но я не мог найти пример для этого. Так может кто-нибудь объяснить на примере? Спасибо заранее.
2 ответа:
не слишком важно давать шаблону и имя, и режим.
The полностью определяет шаблон и не может быть двух шаблонов с одинаковым именем и разными режимами.
The
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
элементы, которые должны образовывать ячейки строки. Для этого мы обрабатываем их с помощью инструкции xslt:<xsl:apply-templates mode="copy" select= ". | following-sibling::*[not(position() >2)]"/>
что означает: "не применяйте к выбранным узлам шаблоны, которые обычно применяются (ни в каком режиме), но применяйте шаблоны, которые находятся в
copy
режим"таким образом, мы не игнорируем выбранного
num
элементы, но обрабатывают их вcopy
режим и созданииtd
s строки.правила шаблона:
<xsl:template match="num"/>
необходимо переопределить встроенные шаблоны xslt (обработка по умолчанию), которые в противном случае вызвали бы строковые значения
num
узлы, положение которых не может быть представлен как3*k +1
, для вывода.Итак, эти узлы обрабатываются оба шаблона:
<xsl:template match="num"/>
и
<xsl:apply-templates mode="copy" select= ". | following-sibling::*[not(position() >2)]"/>
и таким образом, мы получаем желаемый результат.
It было бы поучительно пройти через хороший отладчик 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