2010-08-04 5 views
2

Je échantillon XML comme ceci:expression XPath - aide nécessaire

<users> 
    <user name="user1"> 
     <roles separator=",">ADM,USER</roles> 
    </user> 
    <user name="user2"> 
     <roles separator=",">ADM,GUEST</roles> 
    </user> 
    <user name="user3"> 
     <roles separator=",">READER,GUEST</roles> 
    </user> 
</users> 

Est-il possible d'obtenir tous les utilisateurs qui sont dans le rôle GUEST en utilisant l'expression XPath ?

+0

Bonne question (+1). Voir ma réponse pour un XPath 1.0 court et correct. :) –

+0

J'ai corrigé un problème trouvé par @ Per-T - maintenant ma réponse fournit une très bonne solution XPath 1.0. –

Répondre

0

Si vous êtes en mesure d'utiliser XSLT 2.0, je vous suggère de marquer la chaîne de rôles. L'utilisation de est correcte tant que vous ne commencez pas à avoir des noms de rôle comme "EXTERNALGUEST" ou similaire, car cela correspondrait à cela.

/users/user[tokenize(roles, roles/@separator) = 'GUEST']/@name 

Ce sera XPath tokenizer la roles en fonction de la @separator et les utilisateurs de retour qui a ce rôle.

+0

Malheureusement, j'ai une erreur pendant que j'essaie d'utiliser la fonction tokenize avec C#. – jwaliszko

+0

Oh, je crois que vous devez utiliser XSLT 1.0 si vous allez l'implémenter en C#. Si vous ne voulez pas utiliser Saxon .Net. Je ne pense pas qu'il soit possible de résoudre ce problème avec une simple expression XPath dans la version 1.0, mais je serais heureux d'avoir tort. Cependant, il est possible de résoudre en utilisant des modèles récursifs dans XSLT 1.0. –

1

Cette expression XPath sélectionne tous les utilisateurs dont le rôle contient le noeud GUEST.

//user[contains(roles, 'GUEST')] 

Voir la fonction xpath contains.

+0

Je pense que vous devriez dire que cela fonctionne s'il n'y a pas d'autre rôle ayant "GUEST" comme une partie, comme "EXTERNALGUEST" qu'il a été commenté. –

1

Utilisation:

/users/user/[roles[contains(concat(@separator, ., @separator), 
          concat(@separator, 'GUEST', @separator) 
          ) 
        ] 
      ] 

Ceci permet de sélectionner tous les choix user nœuds, indépendamment du fait que 'GUEST' est le seul rôle ou il est au début, au milieu ou à la fin de la chaîne.

+0

Je crois que vous avez bien compris: '/ users/user [rôles [contient (concat (@separator,., @separator), concat (@separator, 'GUEST', @separator))]]/@ nom' depuis votre XPath est cassé. Mais je vais vous donner +1 de toute façon parce que je n'ai pas eu l'idée ...;) –

+0

@ Per-T: Merci de le remarquer - j'étais très fatigué et endormi hier en répondant ... :( –

+0

+1 Excellente réponse, je m'attendais à ce que vous veniez avec quelque chose d'intelligent comme celui-ci. –