48 votes

distinctes dans Xpath?

J'ai ce fichier XML, à partir de laquelle j'aimerais compter le nombre d'utilisateurs référencées. Mais ils peuvent apparaître dans plus d'une catégorie, et j'aimerais que ces doublons ne pas être pris en compte.
Dans l'exemple ci-dessous, la requête doit retourner 3 et pas 4. Est-il possible de XPath pour le faire? Les utilisateurs ne sont pas triés à tous.

<list>
  <group name='QA'>
    <user name='name1'>name1@email</user>
    <user name='name2'>name2@email</user>
  </group>
  <group name='DEV'>
    <user name='name3'>name3@email</user>
    <user name='name2'>name2@email</user>
  </group>
</list>

33voto

Dimitre Novatchev Points 147842

Un pur XPath 1.0 -- one-liner:

Utilisation:

count(/*/group/user[not(. = ../following-sibling::group/user)])

24voto

gingerbreadboy Points 3129

en utilisant les fonctions de l'espace de noms http://www.w3.org/2005/xpath-functions vous pouvez utiliser

distinct-values(//list/group/user)

Mise à JOUR:

En haut de votre xsl/xslt fichier, vous devez avoir une feuille de style de l'élément, carte de l'url ci-dessus pour le préfixe fn comme ci-dessous...

<xsl:stylesheet version="1.0"
 xmlns:fn="http://www.w3.org/2005/xpath-functions"
 >

ensuite, vous pouvez utiliser

select="fn:distinct-values(//list/group/user)"

cela suppose que vous faites cela dans des modèles et non pas dans une xpathdocument objet auquel cas, vous devez utiliser un namespacemanager classe.

des liens...

http://stackoverflow.com/questions/2686650/xslt-add-namespace-to-root-element

http://www.xqueryfunctions.com/xq/fn_distinct-values.html

http://msdn.microsoft.com/en-us/library/d6730bwt(SV.80).aspx

Sinon, essayez Dimitre Novatchev de réponse.

4voto

raghavendra Points 95

J'ai une meilleure réponse

count(//user[not(. = following::user/.)])

1voto

JSprang Points 3304

Vous ne savez pas si vous pourriez le faire dans XPath, mais il pourrait être fait facilement en utilisant le Système.Linq:

string xml = "<list><group name='QA'><user name='name1'>name1@email</user><user name='name2'>name2@email</user></group><group name='DEV'><user name='name3'>name3@email</user><user name='name2'>name2@email</user></group></list>";
        XElement xe = XElement.Parse(xml);
        int distinctCount = xe.Elements().Elements().Select(n => n.Value).Distinct().Count();

Dans cet exemple, distinctCount sera égal à 3.

0voto

Mitchel Sellers Points 38352

Vous aurez besoin d'utiliser deux fonctions de ce genre.

count(distinct-values(//list/group/user))

De la première à obtenir l' distinct valeurs, count leur

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X