Salut à tous,
Je n'arrive pas à définir mon prope next() pour l'itérateur de saxon. Je m'explique:
A partir d'une première query, je récupère un itérateur sur la liste résultat. Je souhaite ensuite itérer dans une autre requête jusqu'à ce qu'une condition soit atteinte.
Voici un exemple de fichier xml:
Après exécution de la première requête, j'obtiens un itérateur sur les noeuds A.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14 <balise1> <requete1 name="result"> ( doc('monDoc')/A ) </requete1> <requete2> <stream> requête 2 (avec une boucle "for $i in $result") </stream> </requete2> </balise1>
J'ai écris une classe qui implémente net.sf.saxon.om.SequenceIterator et dans laquelle je redéfinie ma méthode next() de manière à ce que ca itère que jusqu'à ma condition.
J'exécute ensuite la deuxième requête avec Saxon en lui passant comme paramètre correspondant à "result" mon itérateur (de manière à ce qu'il fasse le "for $i in $result" jusqu'à ma condition).
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66 public class SequenceIteratorWrapper implements SequenceIterator { private final List<NodeInfo> distinctResultList; private int NbNodeTreated; private final SequenceIterator sequenceIterator; private final FormSettings mySettings; public SequenceIteratorWrapper(final SequenceIterator aseqIt, final FormSettings settings) { sequenceIterator = aseqIt; MySettings = settings; distinctResultList = new ArrayList<NodeInfo>(); NbNodeTreated = 0; } @Override public Item current() { return sequenceIterator.current(); } public boolean existInDistinctResultList(final NodeInfo nodeInfo) { for (final NodeInfo nodeInformation : distinctResultList) { if (nodeInformation.isSameNodeInfo(nodeInfo)) { return true; } } return false; } @Override public SequenceIterator getAnother() throws XPathException { return sequenceIterator.getAnother(); } public List<NodeInfo> getDistinctResultList() { return distinctResultList; } @Override public int getProperties() { return sequenceIterator.getProperties(); } @Override public Item next() throws XPathException { Item result = null; final boolean continueCondition = (distinctResultList.size() <= mySettings.getMaxResultNumberDisplay()) || (NbNodeTreated <= mySettings.getMaxResultNumber()); if (continueCondition) { result = sequenceIterator.next(); } NbNodeTreated++; return result; } @Override public int position() { return sequenceIterator.position(); } }
Dans la XQuery, j'appelle à un moment une fonction java dans laquelle je passe le $result en paramètre. Cependant, le type ne correspond pas au type que j'ai défini et passé en paramètre de la requête (j'ai un net.sf.saxon.query.XQueryExpression$ProgressIterator au lieu du SequenceIteratorWrapper que j'ai défini). De plus, saxon ne passe jamais dans le next() que j'ai redéfinie dans ma classe SequenceIteratorWrapper.
Ai-je mal fait quelque chose? Est-il possible de définir un itérateur utilisable par saxon avec son propre next() de cette manière ou d'une autre?
Je vous remercie d'avance pour vos réponses.
Partager