Czy można podać przykład" mode " szablonu w xsl?
W
<xsl:template name="temp_name" mode="mode">
Jakie jest znaczenie mode
? Przeszukałem wiele zasobów, ale nie mogłem znaleźć na to przykładu. Czy ktoś może wyjaśnić przykładem? Z góry dzięki.
2 answers
Nie jest zbyt sensowne nadawanie szablonowi zarówno nazwy, jak i trybu .
Atrybut name
w pełni identyfikuje szablon i nie mogą istnieć dwa szablony o tej samej nazwie i różnych trybach.
Atrybut mode
pozwala na przetworzenie tych samych węzłów więcej niż jeden raz, przy użyciu różnych trybów .
Oto krótki przykład:
<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>
Gdy ta transformacja jest stosowana na następującym XML dokument :
<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>
W rezultacie liczby są wyświetlane w trzech tr
(wiersze), z których każdy zawiera trzy kolumny (z możliwym wyjątkiem ostatniego wiersza):
<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>
W tej transformacji każdy num
element o pozycji, który nie może być reprezentowany w postaci 3*k +1
(gdzie k
jest liczbą całkowitą), jest dopasowany przez szablon z pustym ciałem i dlatego nie jest przetwarzany.
Chcemy jednak przetworzyć wszystkie num
elementy, które powinny tworzyć komórki rzędu. W tym celu przetwarzamy je za pomocą instrukcji xslt:
<xsl:apply-templates mode="copy" select=
". | following-sibling::*[not(position() >2)]"/>
Co oznacza: "nie stosuj do wybranych szablonów węzłów, które normalnie byłyby stosowane (w trybie no), ale zastosuj szablony, które są w trybie copy
" {23]}
Dlatego nie ignorujemy wybranych elementów num
, lecz przetwarzamy je w trybie copy
i tworzymy td
s wiersza.
Reguła szablonu:
<xsl:template match="num"/>
Jest konieczne, aby nadpisać XSLT wbudowane szablony (domyślne przetwarzanie), które w przeciwnym razie spowodowałyby wyjście wartości łańcuchów num
węzłów, których pozycja nie może być reprezentowana jako 3*k +1
.
Tak więc te węzły są przetwarzane przez oba szablony :
<xsl:template match="num"/>
I
<xsl:apply-templates mode="copy" select=
". | following-sibling::*[not(position() >2)]"/>
I w ten sposób otrzymujemy pożądany rezultat.
Byłoby pouczające, aby przejść przez dobry debugger XSLT, aby zobaczyć, jak te szablony są stosowane.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-12-20 06:59:09
<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>
Podlinkuj prosty przykład tutaj: https://msdn.microsoft.com/en-us/library/ms256045%28v=vs.110%29.aspx
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-04-04 04:24:37