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 :

xslt sélectionner une seule valeur à partir de @ind1


Sujet :

XSL/XSLT/XPATH XML

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Cyberdocumentaliste
    Inscrit en
    Mai 2017
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Cyberdocumentaliste
    Secteur : Enseignement

    Informations forums :
    Inscription : Mai 2017
    Messages : 16
    Points : 7
    Points
    7
    Par défaut xslt sélectionner une seule valeur à partir de @ind1
    Bonjour à tous, je travaille sur une xslt que je dois modifier au minimum.

    je pars d'un xml, marcxml préexistant

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
      <datafield tag="210" ind1=" " ind2=" ">
        <subfield code="a">Paris</subfield>
        <subfield code="c">La Documentation française</subfield>
        <subfield code="d">1962-</subfield>
      </datafield>
      <datafield tag="210" ind1="0" ind2=" ">
        <subfield code="a">Paris</subfield>
        <subfield code="c">La Documentation française</subfield>
        <subfield code="d">1962-2004</subfield>
      </datafield>
      <datafield tag="210" ind1="1" ind2=" ">
        <subfield code="a">Louvain-la-Neuve</subfield>
        <subfield code="c">De Boeck Université</subfield>
        <subfield code="d">2005-</subfield>
    j'ai pour objectif d'afficher le datafied tag='210' le plus récent dans un ordre précis, je m’appuie sur l'indicateur @ind1 qui est correlé à la date (voir ci-dessus)
    exemple :

    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
     <xsl:for-each select="marc:datafield[@tag=210][@ind1=1]">
     <xsl:if test="marc:subfield[@code='a'] or marc:subfield[@code='c'] or marc:subfield[@code='d']">
     <dd>
     <xsl:for-each select="marc:subfield[@code='a']">
     <xsl:value-of select="." />
     <xsl:if test="position() &lt; last()"><xsl:text>, </xsl:text></xsl:if>
     <xsl:if test="position()=last()">
     <xsl:if test="../marc:subfield[@code='c'] or ../marc:subfield[@code='d']">
     <xsl:text> : </xsl:text>
     </xsl:if>
     </xsl:if>
     </xsl:for-each>
     <xsl:for-each select="marc:subfield[@code='c']">
     <xsl:value-of select="." />
     <xsl:if test="position() &lt; last()"><xsl:text>, </xsl:text></xsl:if>
     <xsl:if test="position()=last()">
     <xsl:if test="../marc:subfield[@code='d']">
     <xsl:text> : </xsl:text>
     </xsl:if>
     </xsl:if>
     </xsl:for-each>
     <xsl:for-each select="marc:subfield[@code='d']">
     <xsl:value-of select="." />
     <xsl:if test="position() &lt; last()"><xsl:text>, </xsl:text></xsl:if>
     </xsl:for-each>
     </dd>
     <div style="clear:both"></div>
     </xsl:if>
     </xsl:for-each>
     </xsl:otherwise>
     </xsl:choose>
     </dl>
     </xsl:if>
    je n'arrive pas à mettre une condition de telle sorte que je sélectionne marc:datafield[@tag=210][@ind1=] soit le plus grand possible, ou si @ind seul et afficher mais je bloque sur cette conditionnelle.

    Merci d'avance

  2. #2
    Membre émérite Avatar de tsuji
    Inscrit en
    Octobre 2011
    Messages
    1 558
    Détails du profil
    Informations forums :
    Inscription : Octobre 2011
    Messages : 1 558
    Points : 2 736
    Points
    2 736
    Par défaut
    On peut ajouter un xsl:param ou xsl:variable global (cest-à-dire direct enfant sous xsl:stylesheet).
    Code xslt 1.0 : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    <xsl:param name="maxind1">
        <xsl:for-each select="//marc:datafield[@tag=210]">
            <xsl:sort select="@ind1" data-type="number" order="descending" />
            <xsl:if test="position()=1">
                <xsl:value-of select="@ind1" />
            </xsl:if>
        </xsl:for-each>
    </xsl:param>
    Avec ça, on peut réécrire le xsl:for-each.
    Code xsl : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    <!--
    <xsl:for-each select="marc:datafield[@tag=210][@ind1=1]">
    -->
    <xsl:for-each select="marc:datafield[@tag=210][@ind1=$maxind1]">
    Comme ça, même si le datafield avec @ind1 du genre n'est pas unique, il marche le même.

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Cyberdocumentaliste
    Inscrit en
    Mai 2017
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Cyberdocumentaliste
    Secteur : Enseignement

    Informations forums :
    Inscription : Mai 2017
    Messages : 16
    Points : 7
    Points
    7
    Par défaut
    Merci pour ta réponse, mais je me suis mal exprimé ta méthode est bonne mais je ne dois afficher qu'une seule valeur et par défaut la plus récente ou la seule présente

  4. #4
    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
    Bah ça change pas grand-chose, hein.

    A la rigueur ça te dispense de faire une variable globale, tu peux faire directement un for-each avec sort dans lequel tu ne traites que la position() 1.
    Mais bon, voilà, même solution.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Cyberdocumentaliste
    Inscrit en
    Mai 2017
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Cyberdocumentaliste
    Secteur : Enseignement

    Informations forums :
    Inscription : Mai 2017
    Messages : 16
    Points : 7
    Points
    7
    Par défaut
    Citation Envoyé par thelvin Voir le message
    Bah ça change pas grand-chose, hein.

    A la rigueur ça te dispense de faire une variable globale, tu peux faire directement un for-each avec sort dans lequel tu ne traites que la position() 1.
    Mais bon, voilà, même solution.
    merci ca m'arrangeait de ne pas faire une variable globale car j'ai une balise <xsl:otherwise> au début
    et cela trop d'impact sur l'écriture du xslt , je tour un peu en rond

    j'y ai pensé mais je suis bloqué par la condition qu'il y a sur les champs marc:subfield

    j' ai deux conditions donc deux if et cela me bloque le if pour sélectionner un seul indicateur et le plus grand et l'ordre et l'écriture des marc: subfield je bloque

    <xsl:if test="marc:subfield[@code='a'] or marc:subfield[@code='c'] or marc:subfield[@code='d']">
    <dd>
    <xsl:for-each select="marc:subfield[@code='a']">
    <xsl:value-of select="." />
    <xsl:if test="position() &lt; last()"><xsl:text>, </xsl:text></xsl:if>
    <xsl:if test="position()=last()">
    <xsl:if test="../marc:subfield[@code='c'] or ../marc:subfield[@code='d']">
    <xsl:text> : </xsl:text>
    </xsl:if>
    </xsl:if>
    </xsl:for-each>
    <xsl:for-each select="marc:subfield[@code='c']">
    <xsl:value-of select="." />
    <xsl:if test="position() &lt; last()"><xsl:text>, </xsl:text></xsl:if>
    <xsl:if test="position()=last()">
    <xsl:if test="../marc:subfield[@code='d']">
    <xsl:text> : </xsl:text>
    </xsl:if>
    </xsl:if>
    </xsl:for-each>
    <xsl:for-each select="marc:subfield[@code='d']">
    <xsl:value-of select="." />
    <xsl:if test="position() &lt; last()"><xsl:text>, </xsl:text></xsl:if>
    </xsl:for-each>
    </dd>
    <div style="clear:both"></div>
    </xsl:if>
    </xsl:for-each>
    </xsl:otherwise>
    </xsl:choose>
    </dl>
    </xsl:if>

Discussions similaires

  1. [XSLT] XSLT sur une seul ligne
    Par virgul dans le forum XSL/XSLT/XPATH
    Réponses: 4
    Dernier message: 16/05/2006, 13h54
  2. [Hibernate] Set avec une seule valeur
    Par neuromencien dans le forum Hibernate
    Réponses: 6
    Dernier message: 15/05/2006, 16h49
  3. [XSLT] Afficher une seule fois les attributs redondants...
    Par kobe dans le forum XSL/XSLT/XPATH
    Réponses: 1
    Dernier message: 17/11/2005, 09h52
  4. [MSSQL] Problème pour sélectionner une seule occurence
    Par Tinfolley dans le forum Langage SQL
    Réponses: 4
    Dernier message: 02/07/2004, 09h02
  5. Pourquoi une seule valeur de retour pour les fonctions ?
    Par Bruno75 dans le forum Langages de programmation
    Réponses: 33
    Dernier message: 18/01/2004, 13h58

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