2009-05-13 5 views
0

Je possède ce xml simplifié:xslt apply-templates sélectionne tous les nœuds texte restants

<?xml version="1.0" encoding="UTF-8"?> 

<a> 
    <b> 
     <c> 
      <d>1</d> 
      <e>2</e> 
     </c> 
    </b> 
    <f> 
     <g>3</g> 
    </f> 
</a> 

C'est le xslt j'essaie d'appliquer:

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:fn="http://www.w3.org/2005/xpath-functions"> 
    <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/> 

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

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

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

    <xsl:template match="d"> 

    </xsl:template> 

</xsl:stylesheet> 

Lorsque j'applique cette feuille, je reçois la sortie 2 3, qui sont les textnodes restants. J'ai lu sur les modèles intégrés qui sont appliqués si elle ne peut pas trouver un modèle correspondant, mais dans ce cas, il devrait trouver un modèle?

Que se passe-t-il?

Edit:

Dans ce cas, je pense ne rien voir, parce que les modèles sont vides. Mais je reçois 2 3 à la place.

+1

Il serait utile de dire ce que vous voyez et ce que vous attendez. – 0x6adb015

Répondre

1

Lorsque vous faites <xsl:template match="d">, vous dire le processeur d'ignorer tous les nœuds sous <d>.

Tous les autres noeuds sont traités avec les règles par défaut, y compris le text(), qui consiste à imprimer le texte.

C'est pourquoi vous voyez 23, et non 1.

+0

La chose étrange est que si je n'ai qu'un seul apply-templates, il fonctionne comme il est censé fonctionner. Sélectionne simplement le noeud b dans cet exemple. Mais dès que l'on met un autre apply-templates, il montre al les textnodes. – Ikke

+0

Ah ok, donc si je continuais juste, et spécifié des modèles pour les autres noeuds aussi, ce serait juste fixxed? – Ikke

+0

Si vous ne voulez pas voir de texte, faites ou remplacez les règles par défaut par . – 0x6adb015

0

Début de la racine:

<xsl:template match="/a"> 

Et spécifier un mode (de sorte que le modèle par défaut ne soit pas appelé, parce qu'il ne pas trouver un modèle pour e, f et g) ou définir votre propre modèle * qui ne fait rien à la fin de la feuille de style:

<xsl:template match="*"/> 
+0

Aucune différence .. – Ikke

Questions connexes