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] TRI d'un champs


Sujet :

XSL/XSLT/XPATH XML

  1. #1
    Membre expérimenté
    Avatar de virgul
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    1 625
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 625
    Points : 1 666
    Points
    1 666
    Par défaut [xslt] TRI d'un champs
    Bonjour,

    Voila j'ai un petit challenge a vous proposé... (pour ceux qui aime ca)

    J'ai bien quelque idée mais ca me semble être des transformations trop lourde!

    Le xml de départ:
    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
    <?xml version="1.0" encoding="UTF-8"?>
    <AV GF="1" RF="4" type="Verfuegung">
    <AVel TitNr=" " fldID="235" fmt="TEXT">
    <Title>Verfügung</Title>
    <Text>In das Handelsregister wird eingetragen:</Text>
    </AVel>
    <AVel TitNr="1.1." fldID="101" fmt="TEXT">
    <Title>Firma</Title>
    <Text>Enderli Transporte und Maschinenbetrieb GmbH</Text>
    </AVel>
    <AVel TitNr="1.2." fldID="102" fmt="TEXT">
    <Title>Uebersetzungen der Firma</Title>
    <Text/>
    </AVel>
    <AVel TitNr="2." fldID="110" fmt="SITZ">
    <Title>Sitz</Title>
    <Sitz bfs="177">Pfäffikon</Sitz>
    </AVel>
    <AVel TitNr="3." fldID="115" fmt="ADR">
    <Title>Domizil</Title>
    <Adr fldID="115" fldType="FirmenAdresse">
      <Strasse nr="52">Feldstrasse 52</Strasse>
      <PLZ>8330</PLZ>
      <Ort>Pfäffikon &lt;eigene Büros&gt;</Ort>
      <fullText>Feldstrasse 52_8330 Pfäffikon &lt;eigene Büros&gt;</fullText>
    </Adr>
    </AVel>
    <AVel TitNr="3.1" fldID="119" fmt="ADR">
    <Title>Postadresse</Title>
    <Adr fldID="119" fldType="PostAdresse">
    <fullText></fullText>
    </Adr>
    </AVel>
    <AVel TitNr="4." fldID="67" fmt="LINE">
    <Title>Rechtsform</Title>
    <Text>Gesellschaft mit beschränkter Haftung (Neueintragung)</Text>
    </AVel>
    <AVel TitNr="5." fldID="156" fmt="DATE">
    <Title>Statutendatum</Title>
    <Date></Date>
    </AVel>
    ...
    </AV>
    Ce qu'il faut que je tri c'est ceux qui sont "vide" afin qu'il ne reste pas dans le XML de sortie! Donc ne pas avoir le AVel si la condition n'est pas remplie!

    vide = dans l'element AVel il n'y a "pas de contenu" dans l'élément variable en dessous de la balise Title qui apparait toujours

    pas de contenu= je connais la liste de tout ces éléments qui peuvent venir (la structure est la mais vide) il y en a 13 types d'éléments ou de structures.

    par ex: il a Betrag qui contient juste un champ Betrag
    et il y a adresse qui contient la structure suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    <Adr>
    <Empfaenger/>
    <co/>
    <Strasse></Strasse>
    <Zusatz></Zusatz>
    <PLZ/>
    <Ort/>
    <Land/>
    <fullText/>
    </Adr>
    et là c'est la valeur fullText qui doit être testé!

    Encore un truc je sais de quelle type sera cette élément qui vient après Title grace l'attribut fmt de la balise AVel!

    fmt possible (teste si la valeur est vide):

    ADR et ADRESSE : les même a tester: Adr/fullText ou Adr/Ort
    BETRAG: sa valeur /Betrag
    BISHER: sa valeur /Bisher
    DATE: sa valeur /Date
    EMPTY : celui-ci n'a rien par défaut (seulement le Title)et ne doit pas être enlevé
    GEBUEHR: teste si Gebuehren/Gebuehr/@Betrag
    LINE: si Liste/Line
    LISTE : si Liste/Line ou Liste/Stamps/St1
    SITZ: si /Sitz
    STUECKELUNG: si /STUECKELUNG/Stueck
    TEXT: si /Text

    et le dernier PERSON le plus compliqué il peux être contenu dans trois structure:

    PersBisher test si /PersBisher/Person/Personalien/fulltext ou /PersBisher/Person/Personalien/Ort
    PersNeuMut pareil mais PersNeuMut a la place de PersBisher
    PersLoesch pareil mais PersLoesch a la place de PersBisher

    Ce que je vous demande n'est pas un xslt tout fait mais la facon dont vous procéderiez pour réaliser un tel tri (le squelette du XSLT)! Moi j'ai déjà ma petite idée mais pour ne pas vous influencer je ne vous la mettrai pas!

    Si quelqu'un se sent de taille?

    Bonne chance et merci d'avance pour vos réponse!


    ++

    Thierry
    "Life is short don't forget to inhale"
    Mais: "Mieux vaux arriver en retard dans ce monde... qu'en avance à l'autre."

  2. #2
    Rédacteur

    Avatar de Erwy
    Homme Profil pro
    Développeur Web
    Inscrit en
    Novembre 2003
    Messages
    4 967
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2003
    Messages : 4 967
    Points : 10 927
    Points
    10 927
    Par défaut
    pas clair

    tu veux qu'on vire les AVEL vide ou les champs vides sous les AVEL ?

    dans tous les cas des templates bases sur match="nom_du_noeud[not(text())]" me semblent suffisante (peut être aussi une match="*[(text())]" vide suivant les select)

  3. #3
    Membre expérimenté
    Avatar de virgul
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    1 625
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 625
    Points : 1 666
    Points
    1 666
    Par défaut
    Salut,

    Merci pour ta réponse!

    Le but est de virer tous les AVel qui n'ont pas de contenu dans les balises que j'ai mentionné pour chaque "type".

    Sachant qu'un AVel contient une balise Title + un des "type" ! attention si la valeur fmt est égal a EMPTY il ne faut pas la virer!

    On sais de quelle type sera cette élément (AVel) qui vient après Title grace l'attribut fmt de la balise AVel!

    ex celui ci doit être virer:


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    <AVel TitNr="3." fldID="115" fmt="ADR">
      <Title>Domizil neu</Title> 
    <Adr fldID="115" fldType="FirmenAdresse">
      <fullText /> 
      </Adr>
      </AVel>
    celui-ci aussi:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    <AVel TitNr="0.1.1." fldID="106" fmt="TEXT">
      <Title>Firma</Title> 
      <Text></Text> 
      </AVel>
    mais pas celui-ci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <AVel TitNr="6." fldID="121" fmt="EMPTY">
            <Title>Zweck</Title>
          </AVel>
    J'espère que vous comprendrez maintenant!

    ++

    Thierry
    "Life is short don't forget to inhale"
    Mais: "Mieux vaux arriver en retard dans ce monde... qu'en avance à l'autre."

  4. #4
    Rédacteur

    Avatar de Erwy
    Homme Profil pro
    Développeur Web
    Inscrit en
    Novembre 2003
    Messages
    4 967
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2003
    Messages : 4 967
    Points : 10 927
    Points
    10 927
    Par défaut
    soit mon xml

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    <R>
      <a n="ab">
         <ab></ab>
      </a>
     <a n="ad">
         <ab>aa</ab>
      </a>
      <a n="ac">
         <ac>aa</ac>
      </a>
      <a n="EMPTY">
     
      </a>
    </R>
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    //a[(*[name()=../@n and text()]) or @n='EMPTY']
    ce xpath ne selectionne pas le premier et le deuxieme noeud.

  5. #5
    Rédacteur

    Avatar de Erwy
    Homme Profil pro
    Développeur Web
    Inscrit en
    Novembre 2003
    Messages
    4 967
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2003
    Messages : 4 967
    Points : 10 927
    Points
    10 927
    Par défaut
    apres relecture je complete le xpath

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    //a[(*[name()=../@n and descendant-or-self[text()]]) or @n='EMPTY']

  6. #6
    Rédacteur

    Avatar de Erwy
    Homme Profil pro
    Développeur Web
    Inscrit en
    Novembre 2003
    Messages
    4 967
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2003
    Messages : 4 967
    Points : 10 927
    Points
    10 927
    Par défaut
    GEBUEHR: teste si Gebuehren/Gebuehr/@Betrag

    celui ci devra peut être être gêré comme un cas particulier un peu comme EMPTY

    edit: celui aussi est penible
    LINE: si Liste/Line
    A toi de voir ce qui est le plus complexe

    Tu noteras que je ne teste pas un noeud en particulier mais simplement si un des champs contenu dans celui cité est remplis

  7. #7
    Membre expérimenté
    Avatar de virgul
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    1 625
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 625
    Points : 1 666
    Points
    1 666
    Par défaut
    Ok! quelle belle expression!

    Mais le problème c'est que dans fmt tout est stocké en majuscule et les balises on que la première lettre de chaque mot en maj:

    ex fmt="BETRAG" l'élément est Betrag

    et c'est méthode ne pourra pas fonctionné avec ADR et ADRESSE car tout deux on dans leur AVel l'élément Adr/fullText ou Adr/Ort a testé!

    Et on ne parle pas du problème de fmt="PERSON"!

    Le prob c'est que c'est plein de petit truc comme ca qu'il faut gérer!

    Crois tu qu'on pourrait y arriver avec une seul requête XPATH?
    Moi je pensais a essayer de le diviser en plusieurs catégorie!
    Genre Date, Betrag et text une catégorie car seul un élément ! Qu'en pense tu?

    Merci

    ++

    Thierry
    "Life is short don't forget to inhale"
    Mais: "Mieux vaux arriver en retard dans ce monde... qu'en avance à l'autre."

  8. #8
    Rédacteur

    Avatar de Erwy
    Homme Profil pro
    Développeur Web
    Inscrit en
    Novembre 2003
    Messages
    4 967
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2003
    Messages : 4 967
    Points : 10 927
    Points
    10 927
    Par défaut
    Citation Envoyé par virgul
    Ok! quelle belle expression!

    Mais le problème c'est que dans fmt tout est stocké en majuscule et les balises on que la première lettre de chaque mot en maj:
    c'est chiant et long mais peut être codé en xpath c'est ADRESSE et LINE qui sont le plus genant de ce point de vue

    et c'est méthode ne pourra pas fonctionné avec ADR et ADRESSE car tout deux on dans leur AVel l'élément Adr/fullText ou Adr/Ort a testé!

    Et on ne parle pas du problème de fmt="PERSON"!
    descendant-or-self[text()] test que dans le noeuds demandé il y ait au moins un descendant qui soit non vide.Tout depends si un noeud autre que celui que tu veux testé peut être remplis

  9. #9
    Membre expérimenté
    Avatar de virgul
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    1 625
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 625
    Points : 1 666
    Points
    1 666
    Par défaut
    Tout depends si un noeud autre que celui que tu veux testé peut être remplis
    A part peut-être des attribut mais sinon pas de text dans les autre balise qu'il peux y avoir! Donc on peux l'utiliser

    c'est chiant et long
    Tout à fait d'accord avec toi mais j'ai pas trop le choix!

    C'est aussi un peu pour ca que je fait appelle a vous car maitrisez bien le sujet alors que moi je vais faire 36 combines compliqué pour y arriver!résultat ca ne sera pas performant et je serai emmerdé car je devrais tout revoir!

    Merci beaucoup pour ton aide j'apprécie vraiment!

    ++

    Thierry
    "Life is short don't forget to inhale"
    Mais: "Mieux vaux arriver en retard dans ce monde... qu'en avance à l'autre."

  10. #10
    Rédacteur

    Avatar de Erwy
    Homme Profil pro
    Développeur Web
    Inscrit en
    Novembre 2003
    Messages
    4 967
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2003
    Messages : 4 967
    Points : 10 927
    Points
    10 927
    Par défaut
    allons y pour le fun (pas sur que ce soit la meilleure methode)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    //a[
    (*[name()=concat(substring(../@n,1,1),translate(substring(../@n,2),'ABCDEFGHIJKLMNOPQRSTUVWXYZ','abcdefghijklmnopqrstuvwxyz')) and descendant-or-self[text()]])
     or (*/*[name()=concat(substring(../@n,1,1),translate(substring(../@n,2),'ABCDEFGHIJKLMNOPQRSTUVWXYZ','abcdefghijklmnopqrstuvwxyz')) and descendant-or-self[text()]])
    or @n='EMPTY'
    ]
    Reste le ADRESSE et le GEBUEHR comme cas particulier (un peu chiant les garcons)
    rajouté les retour a ligne pour plus de visibilite

    edit:commence à me rappeller mes requete sql qui font 3 pages

  11. #11
    Rédacteur

    Avatar de Erwy
    Homme Profil pro
    Développeur Web
    Inscrit en
    Novembre 2003
    Messages
    4 967
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2003
    Messages : 4 967
    Points : 10 927
    Points
    10 927
    Par défaut
    STUECKELUNG: si /STUECKELUNG/Stueck
    rassure moi tu as mal ecris ?
    Autrement cela se traitre toujours en xpath mais ca rajoute encore un cas particulier

  12. #12
    Membre expérimenté
    Avatar de virgul
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    1 625
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 625
    Points : 1 666
    Points
    1 666
    Par défaut
    Effectivement c'est Stueckelung




    Ben alors la moi j'ai l'air d'un troll jamais a coté jamais j'aurais pu pondre un truc pareil c'est génial je pensais devoir ecrire un xsl de 1000 lignes

    Ben je vais un peux tester ton expresion pour voir mais c'est fabuleux

    Merci Erwy
    "Life is short don't forget to inhale"
    Mais: "Mieux vaux arriver en retard dans ce monde... qu'en avance à l'autre."

  13. #13
    Rédacteur

    Avatar de Erwy
    Homme Profil pro
    Développeur Web
    Inscrit en
    Novembre 2003
    Messages
    4 967
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2003
    Messages : 4 967
    Points : 10 927
    Points
    10 927
    Par défaut
    pour une presentation bcp plus claire et une maintenance plus aisée je te conseillerais un truc du genre

    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
     
    <?xml version="1.0" encoding="UTF-8"?>
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    	<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
    	<xsl:variable name="v1" select="//a[(*[name()=concat(substring(../@n,1,1),translate(substring(../@n,2),'ABCDEFGHIJKLMNOPQRSTUVWXYZ','abcdefghijklmnopqrstuvwxyz')) and descendant-or-self[text()]]) ]"></xsl:variable>
     
    	<xsl:variable name="v2" select="//a[(*/*[name()=concat(substring(../@n,1,1),translate(substring(../@n,2),'ABCDEFGHIJKLMNOPQRSTUVWXYZ','abcdefghijklmnopqrstuvwxyz')) and descendant-or-self[text()]]) ]"></xsl:variable>
     
    	<xsl:variable name="v3" select="//a[(*[@n='EMPTY']"></xsl:variable>
     
    	<xsl:variable name="v4" select="//a[(*[@n='GEBUEHR'and Gebuehren/Gebuehr/@Betrag ]"></xsl:variable>
     
    	<xsl:variable name="final" select="$v1|$v2|$v3|$v4"></xsl:variable>
     
    	<xsl:apply-templates select="$final"></xsl:apply-templates>
     
     
     
     
    ....
    </xsl:stylesheet>
    avec des commentaires a coté de chaque variable pour expliquer ce qu'elle touche

    je n'ai pas traité ADRESSE mais il suffit de s'inspirer de v4 et duc cas ADR

  14. #14
    Membre expérimenté
    Avatar de virgul
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    1 625
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 625
    Points : 1 666
    Points
    1 666
    Par défaut
    <xsl:variable name="final" select="$v1|$v2|$v3|$v4"></xsl:variable>
    rien qu'un truc comme ca je pensais que ce n'étais pas possible car je pensais qu'une variable est incrémenté qu'une seule fois et ne pouvais de ce fait pas avoir plusieurs valeurs mais déclaré plusieurs valeur en une fois c'est...
    "Life is short don't forget to inhale"
    Mais: "Mieux vaux arriver en retard dans ce monde... qu'en avance à l'autre."

  15. #15
    Rédacteur

    Avatar de Erwy
    Homme Profil pro
    Développeur Web
    Inscrit en
    Novembre 2003
    Messages
    4 967
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2003
    Messages : 4 967
    Points : 10 927
    Points
    10 927
    Par défaut
    ATTENTION, je n'ai pas pu testé exactement ce xpath même si j'ai testé tout les concepts utilisé il peut y avoir des fautes de frappes

  16. #16
    Membre expérimenté
    Avatar de virgul
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    1 625
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 625
    Points : 1 666
    Points
    1 666
    Par défaut
    En tout cas merci mille fois pour ton aide!

    Je vais testé tout ca lundi car la maintenant c'est l'heure de l'apéro 8) (d'ailleurs a ta santé si tu y vas aussi!) !

    Je vais même porter un toast je crois car la c'est amplement mérité!


    C'est trop trop bon moi qui pensait... au non j'y pense plus!


    Au plaisir de te revoir et bon Week-end!

    ++

    Thierry

    P.S. Si tu te mets un jour à Microsoft Office InfoPath fait-moi signe histoire que je puisse te rendre l'appareil!
    "Life is short don't forget to inhale"
    Mais: "Mieux vaux arriver en retard dans ce monde... qu'en avance à l'autre."

Discussions similaires

  1. [XSLT] Tri côté client
    Par licorne dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 06/12/2005, 16h40
  2. tri sur des champs calculés
    Par Thib dans le forum Bases de données
    Réponses: 10
    Dernier message: 18/10/2005, 17h24
  3. [Collection] Tris sur plusieurs champs
    Par partyboy dans le forum Collection et Stream
    Réponses: 4
    Dernier message: 12/07/2005, 16h56
  4. [XSLT] Tri en fonction d'un paramètre
    Par virgul dans le forum XSL/XSLT/XPATH
    Réponses: 9
    Dernier message: 21/04/2005, 10h29
  5. tri avec les champs vides en dernier
    Par r-zo dans le forum Requêtes
    Réponses: 11
    Dernier message: 03/09/2003, 13h40

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