Jak xsl: apply-templates może pasować tylko do zdefiniowanych przeze mnie szablonów?

Mam kilka szablonów, które pasują do różnych węzłów w dokumencie xml. If I do just an
w jakiś sposób rekurencyjnie wyprowadza tekst wszystkich węzłów poniżej. Chcę tylko, aby rekurencyjnie pasował do dowolnego szablonu, który zdefiniowałem. Jak mam to zrobić ?

 22
Author: user43940, 2008-12-06

3 answers

Dzieje się tak z powodu wbudowane szablony w XSLT. XSLT ma kilka wbudowanych szablonów, które powiedz:

  • gdy stosujesz szablony do elementu, przetwarzaj jego elementy potomne
  • gdy zastosujesz szablony do węzła tekstowego, podaj jego wartość

Razem oznacza to, że jeśli zastosujesz szablony do elementu, ale nie mają jawny szablon dla tego elementu, następnie jego zawartość jest przetwarzana i w końcu kończy się z tekst że element zawiera.

Przeczytaj pełne wyjaśnienie tutaj: http://www.dpawson.co.uk/xsl/sect2/defaultrule.html

Możesz nadpisać domyślne szablony dla węzłów tekstowych, definiując własny szablon i każąc mu nic nie robić.

<xsl:template match="text()" />
 38
Author: Mads Hansen,
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
2008-12-06 16:24:06

Jest to prawdopodobnie najczęstszy problem nawet doświadczonych programistów XSLT.

Obserwowane zachowanie jest dokładnie takie, jak powinien zachowywać się procesor zgodny z XSLT.

Weź pod uwagę, że:

    <xsl:apply-templates/>

Jest skrótem od:

    <xsl:apply-templates select="child::node()"/>

I istnienie wbudowanych reguł szablonu . Według XSLT 1.0 Spec.:

"5.8 wbudowane reguły szablonów

Tam jest wbudowaną regułą szablonu umożliwiającą kontynuowanie rekurencyjnego przetwarzania w przypadku braku pomyślnego dopasowania wzorca przez jawną regułę szablonu w arkuszu stylów. Ta reguła szablonu dotyczy zarówno węzłów elementu, jak i węzła głównego. Poniżej przedstawiono odpowiednik wbudowanej reguły szablonu:

<xsl:template match="*|/">
  <xsl:apply-templates/>
</xsl:template>

Istnieje również wbudowana reguła szablonu dla każdego trybu, która pozwala na kontynuowanie rekurencyjnego przetwarzania w tym samym trybie w przypadku braku pomyślnego dopasowania wzorca przez jawne zasada szablonu w arkuszu stylów. Ta reguła szablonu dotyczy zarówno węzłów elementu, jak i węzła głównego. Poniżej przedstawiono odpowiednik wbudowanej reguły szablonu dla trybu m.

<xsl:template match="*|/" mode="m">
  <xsl:apply-templates mode="m"/>
</xsl:template>

Istnieje również wbudowana reguła szablonu dla węzłów tekstu i atrybutów, które kopiują tekst przez:

<xsl:template match="text()|@*">
  <xsl:value-of select="."/>
</xsl:template>

Wbudowana reguła szablonu dla instrukcji przetwarzania i komentarzy ma nic nie robić.

<xsl:template match="processing-instruction()|comment()"/>

Wbudowana reguła szablonów dla węzłów przestrzeni nazw ma również nic nie robić. Nie ma wzorzec, który może pasować do węzła przestrzeni nazw; tak więc wbudowana reguła szablonu jest jedyną regułą szablonu, która jest stosowana dla węzłów przestrzeni nazw.

Wbudowane reguły szablonów są traktowane tak, jakby zostały zaimportowane przed arkuszem stylów i dlatego mają niższy priorytet importowania niż wszystkie inne reguły szablonów. W ten sposób autor może nadpisać wbudowaną regułę szablonu , włączając w to jawną regułę szablonu "

- - - koniec cytatu XSLT Spec ---

Tak więc, jeśli autor chce mieć pełną kontrolę nad przetwarzaniem XSLT, powinien nadpisać wszystkie wbudowane szablony .

Na przykład, jeśli nie chcemy, aby text() węzły były kopiowane do wyjścia, możemy spowodować, że zostaną zignorowane przez nadpisanie wbudowanego szablonu w następujący sposób:

    <xsl:template match="text()" />

 24
Author: Dimitre Novatchev,
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
2008-12-06 17:53:44

Możesz ustawić tryb, aby stosować tylko własne szablony:

<xsl:template match="* | /" >
    <xsl:apply-templates mode="myMode" />
</xsl:template>

<xsl:template match="somenode" mode="myMode">
  <!-- do something here -->
</xsl:template>

Inną opcją byłoby nadpisanie wbudowanych reguł szablonu (patrz np. http://unix.com.ua/orelly/xml/xmlnut/ch08_07.htm )

 2
Author: Dirk Vollmar,
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
2008-12-06 15:34:49