2010-10-01 16 views
0

J'ai le fichier XML structuré suivant:expression XPath pour sélectionner des noeuds entre une séquence définie de précédent et les noeuds succédant

<w:document> 
     <w:body> 
     <w:p> 
      <w:r> 
       <w:t/> 
      </w:r> 
     </w:p> 
     <w:p> 
      <w:r> 
       <w:t/> 
      </w:r> 
     </w:p> 
     <w:p> 
      <w:r> 
       <w:instrText/> 
      </w:r> 
     </w:p> 
     <w:p> 
      <w:r> 
       <w:t/> 
      </w:r> 
     </w:p> 
     <w:p> 
      <w:r> 
       <w:instrText/> 
      </w:r> 
     </w:p> 
     <w:p> 
      <w:r> 
       <w:t/> 
      </w:r> 
     </w:p> 
    </w:body> 
    </w:document> 

et j'essaie désespérément de trouver un XPath expression pour sélectionner tous <w:t> nœuds situés entre deux nœuds <w:instrText>. <w:t> nœuds apparaissent essentiellement librement tout autour du document XML, mais je suis seulement intéressé par ceux entre deux <w:instrText> nœuds.

Toute aide est grandement appréciée.

+0

Document Vous échantillon est pas valide. Il n'y a pas de balises fermantes pour les éléments 't' et' x'. Ou devrait-il s'agir de balises autonomes comme celles-ci: ''? Veuillez corriger afin que nous puissions donner des réponses significatives. –

+0

Excusez-moi, laissez-moi éditer ma question et fournir la structure réelle. – naacal

+1

Comme c'est OpenXml, ne devriez-vous pas regarder le '' w: fldChar w: fldCharType = "commencer" /> ',' 'et' 'éléments? Je suppose que vous voulez extraire le texte du champ? C'est assez complexe à faire dans XPath, car les champs peuvent non seulement être divisés sur plusieurs runs/paragraphes/etc, mais peuvent aussi être imbriqués (l'exemple canonique serait des champs de lien hypertexte dans un champ TOC). –

Répondre

2

J'essaie désespérément de trouver une expression XPath pour sélectionner tous les <w:t> nœuds qui sont entre deux <w:instrText> nœuds

/w:document/w:body/w:p/w:r/w:instrText/following::w:t 
     [count(.|/w:document/w:body/w:p/w:r/w:instrText/preceding::w:t) = 
     count(/w:document/w:body/w:p/w:r/w:instrText/preceding::w:t)] 

ensemble Node expression d'intersection

+0

Merci, ça marche bien :-). – naacal

+0

@naacal: Vous êtes bienvenu. –

+0

@Alejandro: Pourriez-vous lier à une explication du test d'intersection des nœuds? Je suis toujours confus par le compte (.) Test de style. – geoffc

1

N'est-ce pas aussi simple que: //x/t?