2009-12-29 9 views
4

Je ne suis pas très familier avec xpath. Mais je travaillais avec des expressions xpath et les installais dans une base de données. En fait, c'est juste l'outil BAM pour biztalk.XPath concat plusieurs nœuds

Quoi qu'il en soit, j'ai un xml qui pourrait ressembler à:

<File> 
    <Element1>element1<Element1> 
    <Element2>element2<Element2> 
    <Element3> 
    <SubElement>sub1</SubElement> 
    <SubElement>sub2</SubElement> 
    <SubElement>sub3</SubElement> 
    <Element3> 
</File> 

Je me demandais s'il y a un moyen d'utiliser une expression XPath d'obtenir tous les sous-éléments concatted? À l'heure actuelle, j'utilise:

/*[local-name()='File']/*[local-name()='Element3']/*[local-name()='SubElement'] 

Cela fonctionne s'il n'a qu'un seul index. Mais apparemment mon xml a parfois plus de nœuds, donc ça donne NULL. Je pourrais juste utiliser

/*[local-name()='File']/*[local-name()='Element3']/*[local-name()='SubElement'][0] 

mais j'ai besoin de tous les nœuds. Y a-t-il un moyen de faire cela?

Merci beaucoup!

Edit: J'ai changé le XML, je me suis trompé, il est différent, il devrait ressembler à ceci:

<item> 
    <element1>el1</element1> 
    <element2>el2</element2> 
    <element3>el3</element3> 
    <element4> 
     <subEl1>subel1a</subEl1> 
     <subEl2>subel2a</subEl2> 
    </element4> 
    <element4> 
     <subEl1>subel1b</subEl1> 
     <subEl2>subel2b</subEl2> 
    </element4> 
</item> 

Et je dois avoir un code d'une ligne pour obtenir un résultat comme: « subel2a subel2b » ;

J'ai besoin de la ligne parce que j'ai défini cette expression xpath comme un attribut xml (pas mon choix, il est spécifié). J'ai essayé la jointure de cordes mais ça ne marche pas vraiment.

+0

Cela ne devrait-il pas être «» la deuxième fois? – Anthony

+0

Non c'est le point entier – WtFudgE

Répondre

5

string-join(/file/Element3/SubElement, ',')

+7

Malheureusement, string-join() n'est pas dans XPath 1.0. :-( – danorton

0

/File/Element3/SubElement correspondra à tous les éléments SubElement dans votre exemple XML. Qu'est-ce que vous utilisez pour l'évaluer? Si votre méthode d'évaluation est soumise à la "règle du premier nœud", elle ne correspondra qu'à la première. Si vous utilisez une méthode qui renvoie un ensemble de noeuds, il les renverra tous.

0

Vous pouvez obtenir tous les sous-éléments en utilisant:

//SubElement 

Mais cela ne les garder groupés comment vous voulez. Vous voudrez faire une requête pour tous les éléments qui contiennent un sous-élément (effectuez une recherche pour le parent de tout sous-élément).

//parent::SubElement 

Une fois que vous avez, vous pourriez boucle (en fonction de votre langage de programmation) par les parents, et concaténer les sous-éléments.

Questions connexes