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

XML/XSL et SOAP Discussion :

Position d'une balise dans un document externe


Sujet :

XML/XSL et SOAP

  1. #1
    Membre émérite

    Homme Profil pro
    Urbaniste
    Inscrit en
    Mars 2002
    Messages
    255
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : Urbaniste

    Informations forums :
    Inscription : Mars 2002
    Messages : 255
    Points : 2 717
    Points
    2 717
    Par défaut Position d'une balise dans un document externe
    Salut,

    J'ai mis le sommaire du manuel d'utilisation de ma calculatrice dans un fichier à part :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    <?xml version="1.0" encoding="iso-8859-1" ?>
    <sommaire>
      <page>presentation</page>
      <page>premier_calcul</page>
      <page>liste_type</page>
      <page>syntaxe</page>
      <page>operateur</page>
      <page>fonction</page>
      <page>commande</page>
      <page>fonction_util</page>
      <page>programmation</page>
    </sommaire>
    Ce qui me permet de générer le sommaire automatiquement, plutôt pratique !

    Le titre des pages est situé dans le document XML associé (balise <h1>).

    Maintenant, j'aimerai bien calculer la position d'une page dans ce sommaire : si la page syntaxe est affichée, j'aimerai récupérer la position 4. J'ai pondé ce premier jet :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    <xsl:template match="h1">
      <h1>
        <xsl:for-each select="document('xml/sommaire.xml')/sommaire/page">
          <xsl:if test="text()=$page">
            <xsl:number value="position()" format="I. " />
          </xsl:if>
        </xsl:for-each>
        <xsl:value-of select="." />
      </h1>
    </xsl:template>
    Mais un for-each, c'est un peu lourd. Y'a pas plus simple ? J'ai fait deux/trois tests avec xsl:number, mais je ne m'en suis pas sorti :-(

    L'idéal serait une commande du style :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <xsl:value-of select="document('xml/sommaire.xml')/sommaire/page[text()=$page]/position()" />
    @+ Haypo

  2. #2
    Membre confirmé
    Avatar de grishka
    Inscrit en
    Janvier 2003
    Messages
    285
    Détails du profil
    Informations forums :
    Inscription : Janvier 2003
    Messages : 285
    Points : 499
    Points
    499
    Par défaut
    encore une histoire de contexte et d'arbre résultat...

    dans la doc xpath :
    The position function returns a number equal to the context position from the expression evaluation context.
    exemple : si c'était valide, ../position() ne renverrait pas la position du noeud parent mais 1 à chaque fois car le résultat de ../ est un arbre possédant un noeud et donc ce noeud dans cet arbre a toujours comme position 1...

    solution :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    count(preceding-sibling::document('xml/sommaire.xml')/sommaire/page[text()=$page]/)
    "Les gens normaux croient que si ca marche, c'est qu'il n'y a rien à reparer. Les ingénieurs croient que si ca marche, c'est que ca ne fait pas encore assez de choses."
    --Scott Adams

  3. #3
    Membre émérite

    Homme Profil pro
    Urbaniste
    Inscrit en
    Mars 2002
    Messages
    255
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : Urbaniste

    Informations forums :
    Inscription : Mars 2002
    Messages : 255
    Points : 2 717
    Points
    2 717
    Par défaut
    J'ai pas tout compris dans l'expression, pourrais-tu me la détailler un peu ? Selon la référence :
    preceding-sibling::chapter[position()=1] sélectionne le précédent chapter cible du noeud contextuel
    Ca veut dire quoi ?

    Je me demande d'ailleurs depuis longtemps : les trucs en "abc::", il faut les mettre où dans une expression ?

    J'ai testé la fonction, ça me donne un "wrong expression syntax" :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    <xsl:number format="I. "
    value="count(preceding-sibling::document('xml/sommaire.xml')/sommaire/page[text()=$page]/)"   />
    En passant, j'ai trouvé la référence XPATH en français :
    http://xmlfr.org/w3c/TR/xpath/

    @+ Haypo

  4. #4
    Membre confirmé
    Avatar de grishka
    Inscrit en
    Janvier 2003
    Messages
    285
    Détails du profil
    Informations forums :
    Inscription : Janvier 2003
    Messages : 285
    Points : 499
    Points
    499
    Par défaut
    noeud courant = noeud en cours d'analyse dans un template ou un for-each

    noeud contextuel = noeud apparaissant dans une expression x-path. c'est le noeud à partir duquel on évalue l' expression.

    ex : preceding-sibling::c, c est le noeud contexte pour l'axe preceding-sibling


    de plus la bonne syntaxe est il me semble

    document(...)/a/b/preceding-sibling::c
    "Les gens normaux croient que si ca marche, c'est qu'il n'y a rien à reparer. Les ingénieurs croient que si ca marche, c'est que ca ne fait pas encore assez de choses."
    --Scott Adams

  5. #5
    Membre émérite

    Homme Profil pro
    Urbaniste
    Inscrit en
    Mars 2002
    Messages
    255
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : Urbaniste

    Informations forums :
    Inscription : Mars 2002
    Messages : 255
    Points : 2 717
    Points
    2 717
    Par défaut
    Solution qui fonctionne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
        <xsl:if test="$page != 'index'">
        <xsl:number
          value="1+count(document('xml/sommaire.xml')/sommaire/page[text()=$page]/preceding-sibling::*)"
          format="1. "
          />
        </xsl:if>
    Explication sur preceding-sibling :
    http://jerome.developpez.com/xmlxsl/...page=&rpage=16

    @+ Haypo

Discussions similaires

  1. [XPATH] Position d'une balise dans un XML
    Par delta07 dans le forum Format d'échange (XML, JSON...)
    Réponses: 1
    Dernier message: 17/06/2010, 12h03
  2. Position d'une DIV dans IE
    Par Klaim dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 19/05/2005, 13h34
  3. Position d'une ScrollBar dans un TRichEdit (ou TMemo)
    Par Troll dans le forum C++Builder
    Réponses: 9
    Dernier message: 24/02/2005, 15h18
  4. [XSL]faire une balise dans une balise??? (ComboBox)
    Par rastoix dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 23/05/2003, 08h34
  5. [VB6] Position d'une MDIchild dans un MDI
    Par pepper dans le forum VB 6 et antérieur
    Réponses: 6
    Dernier message: 29/01/2003, 14h02

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