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

XSL/XSLT/XPATH XML Discussion :

xs:id xs:ref générer et récupérer des IDs


Sujet :

XSL/XSLT/XPATH XML

  1. #1
    Expert éminent
    Avatar de sekaijin
    Homme Profil pro
    Urbaniste
    Inscrit en
    Juillet 2004
    Messages
    4 205
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Urbaniste
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2004
    Messages : 4 205
    Points : 9 127
    Points
    9 127
    Par défaut xs:id xs:ref générer et récupérer des IDs
    Bonjour.

    j'ai un document à produire par xslt dont les fils doivent contenir des référence à leur père via leur id
    mais celui-ci est généré dynamiquement
    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
    <idoc>
        <idIdoc>idIdoc00001</idIdoc>
        <crCode>1</crCode>
        <crDetail>crDetail</crDetail>
        <interface>NG484</interface>
        <sapTid>sapTid</sapTid>
        <e1edk01>
            <id>0</id> <!-- ICI l'id numérique doit être généré -->
            <belnr>belnr</belnr>
            <bsart>bsart</bsart>
            <idPere>idIdoc00001</idPere>
            <idoc>idIdoc00001</idoc>
            <ze1edk01>
                <id>1</id>
                <city1>city1</city1>
                <faxNumber>faxNumber</faxNumber>
                <e1edk01>0</e1edk01>  <!-- ICI l'id doit être celui qui à été généré au dessus -->
                <idoc>idIdoc00001</idoc>
            </ze1edk01>
        </e1edk01>
    ...
    Je ne sais pas comment faire ce genre de chose. les variables n'étant pas modifiables. je ne vois pas de solution.

    merci de votre aide.
    A+JYT

  2. #2
    Membre émérite
    Avatar de polymorphisme
    Homme Profil pro
    Publishing
    Inscrit en
    Octobre 2009
    Messages
    1 460
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Publishing
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2009
    Messages : 1 460
    Points : 2 372
    Points
    2 372
    Par défaut
    Bonjour,

    tu peux utiliser la fonction

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    string generate-id (node-set?)
    qui retourne toujours le même id pour un ensemble de noeuds donnés.
    Il faut faire ton traitement dans une seule et unique feuille de style XSLT.


    Un exemple explicite sur ZVON
    .

  3. #3
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 567
    Points : 21 635
    Points
    21 635
    Par défaut
    Oui, enfin, generate-id() n'est pas spécialement tenu d'utiliser des nombres, et a obligation d'utiliser des lettres (il doit générer un id valide au sens des id XML.)

    Personnellement, pour générer des ids numériques, je me contenterais de compter combien d'id il a fallu que je génère parmi les nœuds précédents (sur le premier ce sera donc zéro, sur le suivant 1, et ainsi de suite.)

  4. #4
    Membre émérite
    Avatar de polymorphisme
    Homme Profil pro
    Publishing
    Inscrit en
    Octobre 2009
    Messages
    1 460
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Publishing
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2009
    Messages : 1 460
    Points : 2 372
    Points
    2 372
    Par défaut
    Bonjour,

    j'ai hésité entre un comptage des noeuds tel que tu le suggère et la fonction generate-id.

    La raison en ait que la fonction count est relativement gournande contrairement à generate-id,
    En contrepartie, generate-id demande une opération supplémentaire puisqu'il faut effectivement transformer l'identifiant généré en un entier.

    En fait, intuitivement, je dirais que count pourrais s'utiliser avec de petit documents et generate-id avec de gros documents... mais cela ne remplace pas des tests de performances.

    Enfin, dans tous les cas sekaijin a la réponse à sa question

  5. #5
    Expert éminent
    Avatar de sekaijin
    Homme Profil pro
    Urbaniste
    Inscrit en
    Juillet 2004
    Messages
    4 205
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Urbaniste
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2004
    Messages : 4 205
    Points : 9 127
    Points
    9 127
    Par défaut
    Bonjour,

    merci à vous. j'ai trouvé une solution.
    comme on peut le voir dans l'exemple les id sont des neud et non pas des attribut id.
    ce ne sont donc pas des id au sens xml.
    deplus il me fallait des id numériques.
    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
    <idoc>
        <idIdoc>idIdoc00001</idIdoc>
        <crCode>1</crCode>
        <crDetail>crDetail</crDetail>
        <interface>NG484</interface>
        <sapTid>sapTid</sapTid>
        <e1edk01>
            <id>0</id> <!-- ICI l'id numérique doit être généré -->
            <belnr>belnr</belnr>
            <bsart>bsart</bsart>
            <idPere>idIdoc00001</idPere>
            <idoc>idIdoc00001</idoc>
            <ze1edk01>
                <id>1</id>
                <city1>city1</city1>
                <faxNumber>faxNumber</faxNumber>
                <e1edk01>0</e1edk01>  <!-- ICI l'id doit être celui qui à été généré au dessus -->
                <idoc>idIdoc00001</idoc>
            </ze1edk01>
        </e1edk01>
    ...
    j'ai procédé en partant de l'idée du count mais je ne l'ai pas retenu
    j'ai utilisé position()
    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
      <xsl:template name="IDOC" match="IDOC">
        <idoc>
          ...
          <xsl:for-each select="E1EDK01">
            <xsl:call-template name="E1EDK01" >
              <xsl:with-param name="id" select="position()"/>
            </xsl:call-template>
          </xsl:for-each>	
          ...
        </idoc>  
      </xsl:template>
     
      <xsl:template name="E1EDK01" match="E1EDK01">
        <xsl:param name="id"/>
        <e1edk01>
          <id><xsl:value-of select="$id"/></id>
          ...
          <xsl:for-each select="ZE1EDK01">
            <xsl:call-template name="ZE1EDK01" >
              <xsl:with-param name="idPere" select="$id"/>
              <xsl:with-param name="id" select="position() + 1000 * $id"/>
            </xsl:call-template>
          </xsl:for-each>
        </e1edk01>
      </xsl:template>
     
      <xsl:template name="ZE1EDK01" match="ZE1EDK01">
        <xsl:param name="idPere"/>
        <xsl:param name="id"/>
        <ze1edk01>
          <id><xsl:value-of select="$id"/></id>
          ....
          <e1edp01><xsl:value-of select="$idPere"/></e1edp01>
        </ze1edk01>
      </xsl:template>
    ainsi tous les <e1edk01> ont un id incrémenté de 1 en 1
    les <ze1edk01> ont un id incrémenté de 1 à compter à partir de 1000 * l'id du père.

    c'est une contrainte tous mes </ze1edk01> doivent avoir un id différent la xsd prévoit que je ne dois en avoir que 5 par <e1edk01> 1000 me laisse de la marge.

    le résultat est
    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
    <idoc>
        <idIdoc>idIdoc00001</idIdoc>
        <crCode>1</crCode>
        <crDetail>crDetail</crDetail>
        <interface>NG484</interface>
        <sapTid>sapTid</sapTid>
        <e1edk01>
            <id>1</id>
            <belnr>belnr</belnr>
            <bsart>bsart</bsart>
            <idPere>idIdoc00001</idPere>
            <idoc>idIdoc00001</idoc>
            <ze1edk01>
                <id>1001</id>
                <city1>city1</city1>
                <faxNumber>faxNumber</faxNumber>
                <e1edk01>1</e1edk01>
                <idoc>idIdoc00001</idoc>
            </ze1edk01>
        </e1edk01>
        <e1edk01>
            <id>2</id>
            <belnr>belnr</belnr>
            <bsart>bsart</bsart>
            <idPere>idIdoc00001</idPere>
            <idoc>idIdoc00001</idoc>
            <ze1edk01>
                <id>2001</id>
                <city1>city1</city1>
                <faxNumber>faxNumber</faxNumber>
                <e1edk01>1</e1edk01>
                <idoc>idIdoc00001</idoc>
            </ze1edk01>
            <ze1edk01>
                <id>2002</id>
                <city1>city1</city1>
                <faxNumber>faxNumber</faxNumber>
                <e1edk01>1</e1edk01>
                <idoc>idIdoc00001</idoc>
            </ze1edk01>
        </e1edk01>
    ...
    merci à tous
    A+JYT

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

Discussions similaires

  1. Réponses: 5
    Dernier message: 18/08/2014, 18h00
  2. Réponses: 8
    Dernier message: 23/01/2007, 21h02
  3. Réponses: 6
    Dernier message: 28/09/2003, 17h49
  4. Récupérer des données Excel vers Interbase ...
    Par Djedjeridoo dans le forum InterBase
    Réponses: 2
    Dernier message: 20/07/2003, 18h16
  5. cherche module ou langage pour récupérer des données audio..
    Par Ry_Yo dans le forum Langages de programmation
    Réponses: 5
    Dernier message: 12/05/2003, 17h44

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