La mise à jour du compteur de XQuery
Je veux créer un compteur en xquery. Ma première tentative a regardé comme suit:
let $count := 0
for $prod in $collection
let $count := $count + 1
return
<counter>{$count }</counter>
Résultat attendu:
<counter>1</counter>
<counter>2</counter>
<counter>3</counter>
Résultat réel:
<counter>1</counter>
<counter>1</counter>
<counter>1</counter>
La $count
variable, soit de ne pas mettre à jour ou en cours de réinitialisation. Pourquoi ne puis-je pas réaffecter une variable existante? Ce serait une meilleure façon d'obtenir le résultat souhaité?
OriginalL'auteur Gopal Thakur | 2012-04-24
Vous devez vous connecter pour publier un commentaire.
Essayez d'utiliser 'à':
Cela vous donnera la position de chaque '$d'. Si vous souhaitez utiliser cette collaboration avec les
order by
clause, cela ne fonctionne pas depuis le poste est basé sur la commande initiale, et non pas sur le résultat du tri. Pour surmonter cette difficulté, il suffit d'enregistrer le résultat trié de l'expression FLWOR dans une variable, et l'utilisation de laat
clause dans un deuxième FLWOR que juste itère sur la première, résultat trié.Il fonctionne pour moi aussi Merci man! vous sauver la journée!
OriginalL'auteur tohuwawohu
@Ranon dit, tous les XQuery les valeurs sont immuables, de sorte que vous ne pouvez pas mettre à jour une variable. Mais si vous avez vraiment besoin d'un modifiable nombre (il ne devrait pas être trop souvent), vous pouvez utiliser la récursivité:
Il se comporte exactement comme vous le souhaitez avec votre exemple.
Dans XQuery 3.0 une manière plus générale, la version de cette fonction est définie dans la bibliothèque standard: fn:pli-droit($f, $zero, $seq)
Cela dit, dans votre exemple, vous devriez certainement utiliser
at $count
comme indiqué par @tohuwawohu.OriginalL'auteur Leo Wörteler
Immuable variables
XQuery est un langage de programmation fonctionnel, ce qui implique, entre autres, immuables, de variables, de sorte que vous ne peut pas changer la valeur d'une variable. D'autre part, un puissant ensemble de fonctions est disponible pour vous, ce qui résout beaucoup de quotidien les problèmes de programmation.
let $count
, ligne 1, définit cette variable dans la portée de tous, qui sont toutes les lignes suivantes dans ce cas.let $count
en ligne 3 définit un nouveau$count
qui est0+1
, valable dans toutes les lignes suivantes à l'intérieur de ce bloc de code - ce qui n'est pas défini. Si vous avez en effet incrément$count
trois fois par un, mais jeter le résultat est immédiat.BaseX' requête info affiche la version optimisée de cette question, qui est
La solution
Pour obtenir le nombre total d'éléments dans
$collection
, vous pouvez simplement utiliserPour une liste des fonctions XQuery, vous pourriez avoir un coup d'oeil à la XQuery partie de functx qui contient une liste de fonctions XQuery et aussi quelques autres fonctions utiles qui peuvent être inclus en tant que module.
OriginalL'auteur Jens Erat
Spécifiques à MarkLogic vous pouvez également utiliser
xdmp:set
. Mais cela casse un langage fonctionnel hypothèses, afin de l'utiliser de façon conservatrice.http://docs.marklogic.com/5.0doc/docapp.xqy#display.xqy?fname=http://pubs/5.0doc/apidoc/ExsltBuiltins.xml&category=Extension&function=xdmp:set
Pour un exemple de
xdmp:set
dans le monde réel, le code, la recherche de l'analyseur https://github.com/mblakele/xqysp/blob/master/src/xqysp.xqy pourrait être utile.OriginalL'auteur mblakele
Toutes les solutions ci-dessus ne sont valables, mais je tiens à mentionner que vous pouvez utiliser la requête XQuery Script extension pour définir les valeurs de la variable:
Vous pouvez essayer cet exemple live at http://www.zorba-xquery.com/html/demo#twh+3sJfRpHhZR8pHhOdsmqOTvQ=
XQuery Script est une extension offertes par certains XQuery implémentations. Il est particulièrement précis si vous voulez faire les deux mises à jour et le retour des éléments en même temps (par exemple. pour les services web), mais empêche beaucoup d'optimisations possibles. Vous devez vous en tenir à la base XQuery chaque fois que possible.
L'exemple vivant a expiré (404) 🙁
OriginalL'auteur wcandillon
Utilisation
xdmp:set
au lieu de la requête ci-dessousOriginalL'auteur Nikunj Vekariya
Je pense que vous êtes à la recherche pour quelque chose comme:
XQUERY:
De SORTIE:
OriginalL'auteur Navin Rawat