2010-07-23 7 views
2

His,comment pour chaque noeud parent sélectionner tous les noeuds non premiers enfants dans un arbre avec plusieurs noeuds parents

Je pense que j'ai des questions difficiles pour les experts XPath. Il existe une structure de noeud comme celui-ci:

A(1)-| 
    |-B(1) 
    |-B(2) 
    |-B(3) 
A(2)-| 
    |-B(2.1) 
    |-B(2.2) 
    |-B(2.3) 
... 

Comment, avec une seule XPath expression, extraire uniquement les nœuds suivants

A(1)-| 
    |-B(2) 
    |-B(3) 
A(2)-| 
    |-B(2.2) 
    |-B(2.3) 
... 

C'est pour chaque nœud parent son premier élément enfant doit être exclu .

J'ai essayé A/B [position()! = 1] mais cela ne filtrerait que B (1.1) et sélectionner B (2.1).

Merci

Répondre

2

Tricky. Vous pouvez sélectionner les nœuds qui ont précédents frères et soeurs:

A/B[preceding-sibling::*] 

Cela échouera pour le premier élément et réussir pour le reste.

+0

Vous me devança de cinq secondes. – Welbog

+0

Merci. Je l'ai essayé aussi. D'une manière ou d'une autre, ça ne marche pas sur xalan que j'utilise. En fait, d'après les résultats que j'ai à http://www.futurelab.ch/xmlkurs/xpath.en.html, la solution avec position()! = 1 devrait aussi fonctionner, mais elle ne fonctionne pas mon système. Y a-t-il des particularités à garder en tête en utilisant xalan (2.7.1)? – d56

+0

Merci. C'était mon erreur. Les deux solutions fonctionnent (previous-sibling :: * et position() = 1] – d56

3

Cette expression XPath (pas d'axe preceding-sibling:: utilisé):

/*/a/*[not(position()=1)] 

lorsqu'il est appliqué sur ce document XML:

<t> 
<a> 
    <b11/> 
    <b12/> 
    <b13/> 
</a> 
<a> 
    <b21/> 
    <b22/> 
    <b23/> 
</a> 
</t> 

sélectionne les nœuds recherchés:

<b12 /> 
<b13 /> 
<b22 /> 
<b23 /> 

Cela peut être vérifié avec cette transformation XSLT, produisant le résultat ci-dessus:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output omit-xml-declaration="yes" indent="yes"/> 

<xsl:template match="/"> 
    <xsl:copy-of select="/*/a/*[not(position()=1)]"/> 
</xsl:template> 
</xsl:stylesheet> 
+0

Merci, c'était mon erreur, les deux solutions fonctionnent (soit-sibling :: * et position() = 1] – d56

Questions connexes