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


на

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

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

2 64

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