2010-02-04 4 views
1

J'ai besoin d'un XPath qui élira tous les nœuds parents d'un enfant avec un attribut qui constitue au moins une liste de valeurs.XPath Query using contient plusieurs valeurs

Exemple XML

<mynodes> 
    <theParentNode> 
    <theChildNode name="one two" /> 
    </theParentNode> 
    <theParentNode> 
    <theChildNode name="one all" /> 
    </theParentNode> 
    <theParentNode> 
    <theChildNode name="two" /> 
    </theParentNode> 
    <theParentNode> 
    <theChildNode name="all" /> 
    </theParentNode> 
</mynodes> 

Je veux sélectionner tous les noeuds où le nom contient « un » ou « tous » (ou toute autre combinaison pour cette question). Alors que le retour nodeList est:

<theParentNode> 
    <theChildNode name="one two" /> 
</theParentNode> 
<theParentNode> 
    <theChildNode name="one all" /> 
</theParentNode> 
<theParentNode> 
    <theChildNode name="all" /> 
</theParentNode> 

Jusqu'à présent, ma requête ressemble à ceci (note im ne pas utiliser un schéma):

//theChildNode[contains(tokenize(@name, '\s'), "one")]

Ce qui va me faire tous les éléments du fournisseur contenant « un "dans leur attribut de nom. Mais je ne sais pas comment faire pour fournir plusieurs valeurs à la place du «un», puis la meilleure façon de revenir à theParentNode. Je pourrais toujours faire tout cela en php mais je préfère juste le faire avec un XPath si possible.

+0

Pourquoi utilisez-vous « tokenize »? La fonction "contains" ne fonctionne que sur les chaînes et concaténera en interne la chaîne tokenisée. – chiborg

Répondre

4

Un peu redondant, mais cela devrait le faire:

//theChildNode[contains(tokenize(@name, '\s'), "one") or contains(tokenize(@name, '\s'), "all")] 
+0

Vraiment travaillé pour moi. Merci! – prodigitalson

+0

Note aux spectateurs, 'tokenize' est une fonction non enregistrée dans XPath 1.0. –

1

ne suis pas sûr d'obtenir les multiples valeurs d'attribut, mais changer votre sélecteur

// theParentNode [theChildNode]

à obtenir tous les parents avec le noeud enfant.

// theParentNode [theChildNode [contient ....]]

Pas besoin de l'étape, sélectionnez les parents seuls qui ont l'enfant.

+0

Certainement. Je ne sais pas pourquoi je pense que je ne pourrais pas ça. Merci! – prodigitalson

1

Je n'ai pas un environnement de test XML disponible à l'heure actuelle, mais vous pourriez poursuivre cette possibilité:

//theChildNode[intersect(tokenize(@name, '\s+'),('one','all'))] 
+0

Ce serait la syntaxe que je m'attendrais et que j'ai essayé initialement (seulement j'utilise '|' au lieu de ',' en pensant à un opérateur ou). mais a une requête invalide (avec le ',' sep aussi bien). – prodigitalson

Questions connexes