2008-11-03 15 views
3

Je souhaite découper les espaces de fin à la fin de tous les paragraphes XHTML. J'utilise Ruby avec la bibliothèque REXML.Utilisation de XPath: recherche du dernier nœud de texte de chaque paragraphe sous le nœud racine

Dire que j'ai ce qui suit dans un fichier XHTML valide:

<p>hello <span>world</span> a </p> 
<p>Hi there </p> 
<p>The End </p> 

Je veux finir avec ceci:

<p>hello <span>world</span> a</p> 
<p>Hi there</p> 
<p>The End</p> 

Je pensais que je pouvais utiliser XPath pour obtenir juste le texte nœuds que je veux, puis couper le texte, ce qui me permettrait de finir avec ce que je veux (précédent).

j'ai commencé avec le XPath suivant:

//root/p/child::text() 

Bien sûr, le problème ici est qu'il retourne tous les nœuds de texte qui sont des enfants de tous les p-tags. Ce qui est le suivant:

'hello ' 
' a ' 
'Hi there ' 
'The End ' 

Essayer la XPath suivante me donne le dernier nœud de texte du dernier paragraphe, pas le dernier nœud de texte de chaque paragraphe qui est un enfant du nœud racine.

//root/p/child::text()[last()] 

Cela ne Retour: 'The End '

Ce que je voudrais obtenir de l'XPath est donc:

' a ' 
'Hi there ' 
'The End ' 

Puis-je faire avec XPath? Ou devrais-je envisager d'utiliser des expressions régulières (c'est probablement plus un problème de tête que XPath)?

Répondre

7

Votre exemple a fonctionné pour moi

//p/child::text()[last()]
+0

qui obtient seulement le dernier résultat cependant, il veut tous dans le document – Jake

+0

non, il donne l'ensemble de données exact qu'il demandait. Il renvoie le dernier élément de texte enfant de chaque p (dans ce cas, trois d'entre eux) – nickf

+0

@nickf: Vous avez raison. Quand tu as dit que ça marchait, je suis allé vérifier. Ce faisant, cela montre que le problème semble être lié à l'implémentation de XPath par la bibliothèque Ruby REXML. Eh bien, je ne le dirai pas jusqu'à ce que j'étudie davantage. Pourrait être un paramètre que je dois passer à REXML (ou une telle chose) – dbarros

1

Juste au cas où vous ne saviez pas, a une fonction XSL normalize-space() qui va se débarrasser des plus grands et des espaces de fuite.

+0

Merci pour la réponse. Peut-normalize-space() ou une fonction similaire, supprimer uniquement les espaces de fin (en laissant les espaces de premier plan seuls)? – dbarros