2011-07-01 4 views
2

J'essaie d'analyser une feuille de calcul OpenOffice pour obtenir des lignes avec des valeurs uniques dans la première colonne. I.E., je voudrais récupérer à partir du fragment XML suivant tous les éléments <table:table-row> avec des valeurs uniques <text:p> dans le premier enfant <table:table-cell>.Sélection d'éléments avec des valeurs uniques

<table:table table:name="foo"> 
     <table:table-row> 
      <table:table-cell> 
       <text:p>1</text:p> 
      </table:table-cell> 
      <table:table-cell> 
       <text:p>foo</text:p> 
      </table:table-cell> 
     </table:table-row> 
     <table:table-row> 
      <table:table-cell> 
       <text:p>2</text:p> 
      </table:table-cell> 
      <table:table-cell> 
       <text:p>bar</text:p> 
      </table:table-cell> 
     </table:table-row> 
     <table:table-row> 
      <table:table-cell> 
       <text:p>1</text:p> 
      </table:table-cell> 
      <table:table-cell> 
       <text:p>baz</text:p> 
      </table:table-cell> 
     </table:table-row> 
    </table:table> 

Je voudrais obtenir la sortie ci-dessous sous forme de nœuds

 <table:table-row> 
      <table:table-cell> 
       <text:p>1</text:p> 
      </table:table-cell> 
      <table:table-cell> 
       <text:p>foo</text:p> 
      </table:table-cell> 
     </table:table-row> 
     <table:table-row> 
      <table:table-cell> 
       <text:p>2</text:p> 
      </table:table-cell> 
      <table:table-cell> 
       <text:p>bar</text:p> 
      </table:table-cell> 
     </table:table-row> 

Comment puis-je faire avec XPath?

+0

XPath est juste une expression pour obtenir un Elemente défini | Attributs | nœud de votre dom. Ce que vous aimeriez, c'est transformer votre fichier XML initial en un autre. Vous faites cela en utilisant XSLT, puis en utilisant l'expression XPath en utilisant XSLT. – Spredzy

+1

Je voulais obtenir des nœuds, je ne me suis pas dit que je pouvais aussi avoir XML. Merci. – Aru

Répondre

0

Cette XPath produit une sortie souhaitée: /table:table/table:table-row[not(./table:table-cell[1]/text:p/text() = preceding-sibling::table:table-row/table:table-cell[1]/text:p/text())]

0

XPath pur doit être:

/table:table/table:*[not(
    .//text:p[1] 
    = preceding-sibling::table:table-row//text:p[1] 
)] 

Si avec la sortie attendue vous dire une séquence de table:row noeuds et non un document XML comme quelqu'un correctement remarqué dans les commentaires.

/table:table/table:*[not(
    ./table:*[1]//text:*[1] 
    = preceding-sibling::table:*/table:*[1]/text:*[1] 
)] 
+0

Je ne comprends pas votre expression XPath mais cela produit un noeud vide supplémentaire pour moi. Merci pour le code et la clarification si. – Aru

+0

@polishchuk réponse est beaucoup plus sûr parce que c'est un XPath absolu peut-être un peu verbeux. Je vous en ai donné un court (qui fonctionne parfaitement sur votre saisie de question), qui doit être réglé en fonction des connaissances que vous avez de votre entrée xml (et de XPath :)). Juste pour la correction, j'ai édité la question avec un XPath plus sûr qui devrait être moins général, mais plus sûr. –

Questions connexes