IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

XQUERY/SGBD XML Discussion :

recuperer une partie de chaine de caractères


Sujet :

XQUERY/SGBD XML

  1. #1
    Membre éclairé Avatar de tigunn
    Homme Profil pro
    Développeur de bug
    Inscrit en
    Janvier 2003
    Messages
    608
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations professionnelles :
    Activité : Développeur de bug

    Informations forums :
    Inscription : Janvier 2003
    Messages : 608
    Points : 658
    Points
    658
    Par défaut recuperer une partie de chaine de caractères
    Salut à tou(te)s,

    Je voudrais récupérer par une requête xquery une partie seulement de la valeur d'un attribut dans un fichier xml présenté ainsi:
    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
    <item type="fragment" n="1">
    					<cit dbp:hand="encre">
    						<quote>bla<choice>
    								<orig><c>&amp;</c></orig>
    								<reg>et</reg>
    							</choice> bablabla <choice>
    								<orig><c>&amp;</c></orig>
    								<reg>et</reg>
    							</choice>bla <lb/>bla. »</quote>
    						<bibl xml:id="b2862-3"><lb/><choice>
    								<abbr>P.</abbr>
    								<expan>P<ex>ère</ex></expan>
    							</choice> Féfé <choice>
    								<abbr>progr.</abbr>
    								<expan><reg>P</reg>an<ex>ès</ex></expan>
    							</choice> par le <choice>
    								<abbr>chr</abbr>
    								<expan>chr<ex>blabla</ex></expan>
    							</choice> (<abbr>t</abbr><supplied>.</supplied> 2. <supplied reason="omission"><abbr>p.</abbr></supplied> 91)</bibl>
    					</cit>
    				</item>
    Sauf qu'il y a plusieurs <item> dans le fichier.
    La valeur que je voudrais retourner est en gras. Mais je souhaiterais traiter celle-ci et ne conserver que "2862".
    Je pensais donc utiliser la fonction substring() mais je ne comprend pas comment elle fonctionne, même avec les tutos .
    Voici ma requete, qui hors des lignes concernant substring() fonctionne très bien.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    declare namespace dbp="http://dossiers-travail/ns/1.0";
    			for $doc in collection("/db/bdd")/*:TEI
    			for $fragment in $doc//*:div[@*:type="fragment"]|$doc//*:item[@*:type="fragment"]
    			let $bibl3 := data($fragment/descendant-or-self::*:bibl[ends-with(@*:id, "-3")]/@*:id)
    			let $id_b3 := substring($bibl3, 2, 4)
    			let $no_fragment := data($fragment/@n)
    				return <record>
    							<fragment>
    								<bibl3>{$bibl3}</bibl3>
    								<id_b3>{$id_b3}</id_b3>
    								<no_fragment>{$no_fragment}</no_fragment>
    							</fragment>
    						</record>
    Et le message d'erreur (retourné par Exist):
    An exception occurred during query execution: The actual cardinality for parameter 1 does not match the cardinality declared in the function's signature: substring($source as xs:string?, $starting-at as xs:double, $length as xs:double) xs:string?. Expected cardinality: zero or one, got 2


    org.xmldb.api.base.XMLDBException: The actual cardinality for parameter 1 does not match the cardinality declared in the function's signature: substring($source as xs:string?, $starting-at as xs:double, $length as xs:double) xs:string?. Expected cardinality: zero or one, got 2.
    at org.exist.xmldb.RemoteXPathQueryService.throwException(RemoteXPathQueryService.java:179)
    at org.exist.xmldb.RemoteXPathQueryService.query(RemoteXPathQueryService.java:102)
    at org.exist.xmldb.RemoteXPathQueryService.query(RemoteXPathQueryService.java:71)
    at org.exist.xmldb.RemoteXPathQueryService.execute(RemoteXPathQueryService.java:411)
    at org.exist.client.QueryDialog$QueryThread.run(QueryDialog.java:473)
    Caused by: org.exist.xquery.XPathException: The actual cardinality for parameter 1 does not match the cardinality declared in the function's signature: substring($source as xs:string?, $starting-at as xs:double, $length as xs:double) xs:string?. Expected cardinality: zero or one, got 2.
    at org.exist.xmldb.RemoteXPathQueryService.throwException(RemoteXPathQueryService.java:178)
    ... 4 more
    Caused by: org.exist.xquery.XPathException: The actual cardinality for parameter 1 does not match the cardinality declared in the function's signature: substring($source as xs:string?, $starting-at as xs:double, $length as xs:double) xs:string?. Expected cardinality: zero or one, got 2.
    at org.exist.xmldb.RemoteXPathQueryService.throwException(RemoteXPathQueryService.java:178)
    at org.exist.xmldb.RemoteXPathQueryService.query(RemoteXPathQueryService.java:102)
    at org.exist.xmldb.RemoteXPathQueryService.query(RemoteXPathQueryService.java:71)
    at org.exist.xmldb.RemoteXPathQueryService.execute(RemoteXPathQueryService.java:411)
    at org.exist.client.QueryDialog$QueryThread.run(QueryDialog.java:473)
    Merci de votre aide
    Le monde se divise en deux: ceux qui utilisent le tag et les autres.

  2. #2
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 551
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 607
    Points
    21 607
    Par défaut
    Le message d'erreur est pourtant clair : ta variable $bibl3 contient plus d'une chaîne, alors que la fonction substring() n'accepte de travailler que sur une ou zéro chaîne (zéro aussi ? Ah bon...)

    Il faut croire que dans ton document, il existe plus d'un élément <bibl> situé dans un xpath compatible, qui contienne un attribut id de namespace quelconque, dont la valeur termine par '-3'.
    Il va donc falloir raffiner la recherche.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Membre éclairé Avatar de tigunn
    Homme Profil pro
    Développeur de bug
    Inscrit en
    Janvier 2003
    Messages
    608
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations professionnelles :
    Activité : Développeur de bug

    Informations forums :
    Inscription : Janvier 2003
    Messages : 608
    Points : 658
    Points
    658
    Par défaut
    Je comprend ma requête ainsi:
    Pour tous les documents, de la collection ...
    Pour chaque fragment dans ces documents
    on récupère $bibl3, donc la valeur de l'attribut id de bibl (<bibl xml:id="2864-3">)
    et la valeur de l'attribut n de notre element fragment

    En résultat, on obtiens qqchose du genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    <record><fragment><bibl3>b2325-3</bibl3><no_fragment>1</no_fragment></fragment></record>
    <record><fragment><bibl3>b2322-3</bibl3><no_fragment>2</no_fragment></fragment></record>
    <record><fragment><bibl3>b2324-3</bibl3><no_fragment>3</no_fragment></fragment></record>
    <record><fragment><bibl3>b2326-3</bibl3><no_fragment>4</no_fragment></fragment></record>
    <record><fragment><bibl3>b2778-3</bibl3><no_fragment>1</no_fragment></fragment></record>
    <record><fragment><bibl3>b2777-3</bibl3><no_fragment>2</no_fragment></fragment></record>....
    Si j'enlève le substring, ce qui est tout à fait correct.
    Pour chaque fragment, il n'y a qu'un seul élément <bibl>.
    Comprend pas ...
    Le monde se divise en deux: ceux qui utilisent le tag et les autres.

  4. #4
    Membre éclairé Avatar de tigunn
    Homme Profil pro
    Développeur de bug
    Inscrit en
    Janvier 2003
    Messages
    608
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations professionnelles :
    Activité : Développeur de bug

    Informations forums :
    Inscription : Janvier 2003
    Messages : 608
    Points : 658
    Points
    658
    Par défaut
    Finalement, je fais le traitement en php; c'est bien plus simple.
    Le monde se divise en deux: ceux qui utilisent le tag et les autres.

  5. #5
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 551
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 607
    Points
    21 607
    Par défaut
    Entre-temps, j'avais pas mal cherché (par curiosité) ce qui pouvait bien faire qu'il se plaigne de la cardinalité. J'ai fait chou blanc total. Peut-être un bug, mais c'est difficile à prouver.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Transformer une partie de chaine de caractère en majuscule.
    Par DelphLaga dans le forum Débuter avec Java
    Réponses: 2
    Dernier message: 14/05/2007, 14h00
  2. case sur une partie de chaine de caractère
    Par jonathan1 dans le forum VBA Access
    Réponses: 5
    Dernier message: 27/04/2007, 17h03
  3. Récuperer une partie de chaine de caractère
    Par lolo_bob2 dans le forum Access
    Réponses: 6
    Dernier message: 06/07/2006, 18h34
  4. Réponses: 7
    Dernier message: 21/06/2006, 16h42
  5. Remplacer une PARTIE de chaine de caractères dans un champ
    Par Turlututuchapopointu dans le forum Langage SQL
    Réponses: 1
    Dernier message: 07/08/2005, 11h57

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo