2009-05-17 7 views
0

Je souhaite sélectionner tous les noeuds descendants mais "blog". Pour l'exemple, seul subtree devrait apparaître en sortie. J'essaie ce code xsl:Filtre xsl sur select

<xsl:template match="rdf:RDF"> 
    <xsl:copy>  
     <xsl:copy-of select="descendant::*[not(descendant::blog)]"/> 
    </xsl:copy> 
    </xsl:template> 

pour cette xml:

<rdf:RDF> 
    <profesor rdf:ID="profesor_39"> 
    <nombre rdf:datatype="http://www.w3.org/2001/XMLSchema#string" 
    >Augusto</nombre> 
    </profesor> 
    <blog rdf:ID="blog_41"> 
    <entradas> 
     <entrada_blog rdf:ID="entrada_blog_42"> 
     <etiquetas> 
      <tecnologia rdf:ID="tecnologia_49"> 
      <termino rdf:datatype="http://www.w3.org/2001/XMLSchema#string" 
      >Atom</termino> 
      </tecnologia> 
     </etiquetas> 
     <autor> 
      <alumno rdf:ID="alumno_38"> 
      <nombre rdf:datatype="http://www.w3.org/2001/XMLSchema#string" 
      >Jesus</nombre> 
      </alumno> 
     </autor> 
     </entrada_blog> 
    </entradas> 
    <autores rdf:resource="#alumno_38"/> 
    <direccion rdf:datatype="http://www.w3.org/2001/XMLSchema#string" 
    >http://tfg1.unex.es/10comunidad/wordpress/</direccion> 
    </blog> 
</rdf:RDF> 

Qu'est-ce que je manque? Les nœuds "blog" sont toujours imprimés sur la sortie. Merci.

Répondre

1

Pour omettez blog et tous ses enfants:

<xsl:template match="RDF"> 
    <xsl:copy-of select="child::node()[name() != 'blog']"/> 
</xsl:template> 

Pour omettez blog, mais encore o/p ses enfants:

<xsl:template match="RDF"> 
    <xsl:copy-of select="descendant::node()[name() != 'blog']"/> 
</xsl:template> 
+1

La seconde explose le résultat; ce n'est probablement pas ce que vous voulez. Il copierait tous les et ses descendants (y compris , etc.); * puis * il copiera et ses descendants. Donc, vous finiriez avec beaucoup de sous-arbres en double. Une transformation d'identité modifiée (voir ma réponse) vous donnerait le plus de pouvoir dans les deux cas. –

5

est ici une solution complète:

<xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 

    <!-- By default, recursively copy all nodes unchanged --> 
    <xsl:template match="@* | node()"> 
    <xsl:copy> 
     <xsl:apply-templates select="@* | node()"/> 
    </xsl:copy> 
    </xsl:template> 

    <!-- But strip out <blog> --> 
    <xsl:template match="blog"/> 

    <!-- If you want to strip out just the <blog> start and end tags, use this instead: 
    <xsl:template match="blog"> 
    <xsl:apply-templates/> 
    </xsl:template> 
    --> 

</xsl:stylesheet> 
0

Le condition non (descendant :: blog) exclut tout noeud ayant un descendant nommé "blog".

Donc, si vous avez:

<blog id="1"> 
    <test id="1.1"> 
    <blog id="1.1.1" /> 
    </test> 
</blog> 
<blog id="2"> 
    <test id="2.1" /> 
</blog> 

Il exclura id blog < = "1" > et < id test = "1.1" >, parce que ces noeuds ont tous deux < id blog = "1.1.1 "> en tant que descendant.

Mais il ne sera pas exclure < le blog id = "1.1.1" ou > < Blog id = "2" > parce qu'ils n'ont pas de descendant nommé "blog"

Notez également que votre sélection de descendant :: * [pas (descendant :: blog)] affichera < test id = "2.1" > deux fois: une fois dans < blog id = "2" >, et encore une fois par lui-même. Pour une solution complète, celle proposée par Evan Lenz (Transformation d'identité avec un gabarit de remplacement vide pour les nœuds «blog») est probablement celle qui donne le résultat que vous vouliez.