2010-08-17 3 views
2

je le fichier XML suivant:Itérer et concat en utilisant XPath Expression

<author> 
    <firstname>Akhilesh</firstname> 
    <lastname>Singh</lastname> 
</author> 
<author> 
    <firstname>Prassana</firstname> 
    <lastname>Nagaraj</lastname> 
</author> 

Et j'utilise l'expression JXPath suivante,

concat(author/firstName," ",author/lastName) 

Pour obtenir la valeur Akhilesh Singh ,Prassana Nagaraj mais Je reçois seulement Akhilesh Singh.

Mon exigence est que je devrais obtenir la valeur de l'auteur en n'exécutant qu'une seule expression JXPath.

+0

Pouvez-vous poster XML complet? – YoK

+0

Bonne question (+1). Voyez ma réponse pour une solution XPath 2.0 à une ligne. :) –

Répondre

0

concat() retournera une seule chaîne. Si vous voulez les deux résultats, vous devez parcourir l'élément "author" et faire "concat(firstName," ",lastName)"

+0

J'ai essayé mais ça ne fonctionne pas –

+0

@Akhilesh Kumar singh Pouvez-vous partager le code comment vous l'avez fait? – YoK

3

Avec XPath 1.0, lorsqu'un type d'argument autre que l'ensemble de nœuds est attendu, le premier nœud de l'ensemble de nœuds est sélectionné, puis appliquer la conversion de type (la conversion de type booléen est un peu différente).

Ainsi, votre expresion (Note: pas de capital):

concat(author/firstname," ",author/lastname) 

Il est le même que:

concat(string((author/firstname)[1]), " ", string((author/lastname)[1])) 

Selon la langue d'accueil, vous pouvez utiliser:

author/firstname|author/lastname 

Ceci est évalué à un ensemble de nœuds avec firstName et lastName dans l'ordre du document, alors vous pouvez parcourir l'ensemble de nœuds en extrayant la valeur de la chaîne.

Dans XPath 2.0, vous pouvez utiliser:

string-join(author/concat(firstname,' ', lastname),' ,') 

Sortie:

Akhilesh Singh ,Prassana Nagaraj 

Remarque: Maintenant, avec des appels séquence type de données et fonction étapes, XPath ressemble le langage fonctionnel, il prétend être. Fonctions d'ordre supérieur et application partielle doivent attendre à XPath 2.1 ...

Édition: Merci aux commentaires de Dimitre, j'ai corrigé le séparateur de chaîne.

+0

+1 pour la bonne explication. –

+0

Voir ma réponse pour un meilleur one-liner XPath 2.0. :) –

+0

L'expression XPath 2.0 construit une chaîne qui se termine par ",", mais l'OP ne veut pas de virgule finale. –

7

XPath 2.0 solution:

/*/author/concat(firstname, ' ', lastname, following-sibling::author/string(', ')) 
+0

Oui, en ajoutant un '', '' seulement s'il y a un frère suivant 'author'. Mais, pensez-vous que cela a de meilleures performances que 'fn: string-join'? –

+1

@Alejandro: avant de poser des questions sur les performances, veillez à corriger votre réponse - l'OP veut des * délimités par des virgules *, pas des noms * délimités par des NL. La partie délicate ici est de ne pas avoir la virgule après le nom de famille. –

+0

+1 Deux fois. Tu as raison! Maintenant, vous mentionnez, je vois la virgule. –

Questions connexes