2010-07-17 6 views
3
<?xml version="1.0" encoding="ISO-8859-1"?> 

<users> 

<user number="0775547857"> 
    <step stepnumber="1">complete</step> 
    <step stepnumber="2">complete</step> 
    <step stepnumber="3">complete</step> 
</user> 

<user number="0775543754"> 
    <step stepnumber="1">complete</step> 
    <step stepnumber="2">complete</step> 
</user> 

<user number="0777743059"> 
    <step stepnumber="1">complete</step> 
</user> 

</users> 

Étant donné un nombre, je souhaite trouver le nombre maximal de pas dans la liste des étapes.XPath correspondant à l'élément avec la valeur maximale d'un attribut

Ce que j'ai jusqu'à présent est //user[@number='0775547857']/step[@stepnumber]

Et je pense que je dois utiliser la fn: max mais je ne parviens pas à sur la façon d'utiliser la fonction max passer la liste des numéros d'étape.

Exemple: Si je donne le numéro 0775547857, le nombre maximum d'étape est 3 et pour 0775543754 il est 2 et ainsi de suite.

Merci beaucoup d'avance.

Est-ce correct?

//user[@number='0772243950']/step[fn:max((@stepnumber))] 
+0

Bonne question (1). Voir ma réponse pour l'explication et séparer les solutions XPath 2.0 et XPath 1.0. –

Répondre

1

La fonction max() est définie uniquement dans XPath 2.0 et plus.

Un XPath Expression 2.0 qui trouve la stepnumber maximale des step enfants d'un user qui a un attribut number avec la valeur $pNumest:

max(/*/user[@number=$pNum]/step/@stepnumber/xs:integer(.)) 

Substituant $pnum avec 0775547857 et l'évaluation de ce XPath 2.0 expression sur le document XML suivant:

<users> 
    <user number="0775547857"> 
     <step stepnumber="1">complete</step> 
     <step stepnumber="11">complete</step> 
     <step stepnumber="2">complete</step> 
     <step stepnumber="3">complete</step> 
    </user> 
    <user number="0775543754"> 
     <step stepnumber="1">complete</step> 
     <step stepnumber="2">complete</step> 
    </user> 
    <user number="0777743059"> 
     <step stepnumber="1">complete</step> 
    </user> 
</users> 

produit le résultat souhaité, correct:

11 

Prenez note: En utilisant les xs:integer(.) ci-dessus est nécessaire si nous voulons trouver le maximum de valeurs entiers. Sans cela, le maximum sera trouvé sur les valeurs en tant que chaînes et 3 sera plus grand que 11.

Dans XPath 1.0 l'expression XPath suivante renvoie la valeur maximale voulu:

/*/user[@number=$pNum]/step 
      [not(@stepnumber 
       < 
       ../step/@stepnumber 
       ) 
      ] 
       /@stepnumber 
0

Essayez ceci: fn:max(//user[@number='0775547857']/step[@stepnumber])

Questions connexes