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 :

Problème de tri sur collection d'enfants hétérogènes


Sujet :

XSL/XSLT/XPATH XML

  1. #1
    Membre habitué Avatar de touftouf57
    Profil pro
    Développeur .NET
    Inscrit en
    Décembre 2007
    Messages
    362
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2007
    Messages : 362
    Points : 174
    Points
    174
    Par défaut Problème de tri sur collection d'enfants hétérogènes
    Bonjour à tous,

    Je cherche à me faire un format de bibliographie perso, mais je rame avec la mise en place d'un tri alphabétique.
    Le truc c'est que chaque noeud n'a pas les même type de fils, et donc c'est en fonction des fils que je récupère la valeur qui me servira de champs pour le tri.
    J'ai voulu utiliser les variables, mais cela ne fonctionne pas, je n'ai rien en sortie. Je ne saisi pas ce que j'ai raté / pas compris.

    L'objectif, pour moi, ce serait de trier les éléments b:Source pour ensuite appliquer les transformations que j'ai déjà définies.

    Voici mon xslt
    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
    <?xml version="1.0" encoding="UTF-8"?>
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
        xmlns:msxsl="urn:schemas-microsoft-com:xslt"
        xmlns:b="http://schemas.openxmlformats.org/officeDocument/2006/bibliography">
     
        <xsl:output method="xml" encoding="us-ascii"/>
     
        <xsl:template match="/">
        <xsl:for-each select="b:Source">
           <xsl:variable name="NomTri">
                <xsl:choose>
                    <xsl:when test="string-length(b:Author/b:Author/b:Corporate)>0">
                        <xsl:value-of select="./b:Author/b:Author/b:Corporate"/>
                    </xsl:when>
                    <xsl:otherwise>
                        <xsl:value-of select="./b:Author/b:Author/b:NameList/b:Person/b:Last"/>
                    </xsl:otherwise>
                </xsl:choose>
            </xsl:variable>
            <xsl:sort select="$NomTri"/>
            <xsl:call-template name="recopie"></xsl:call-template>
        </xsl:for-each>        
        </xsl:template>
     
    <!-- juste en test afin de voir si le tri est correct -->    
        <xsl:template name="recopie">
            <xsl:copy-of select="node()">
            </xsl:copy-of>        
        </xsl:template>
    </xsl:stylesheet>
    et le code xml original
    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
    <b:Sources    xmlns:b="http://schemas.openxmlformats.org/officeDocument/2006/bibliography"
        xmlns="http://schemas.openxmlformats.org/officeDocument/2006/bibliography">
        <b:Source>
            <b:Tag>ris</b:Tag>
            <b:SourceType>InternetSite</b:SourceType>
            <b:Guid>{DD6B2560-22C7-4112-9924-25896C446188}</b:Guid>
            <b:LCID>0</b:LCID>
            <b:Author>
                <b:Author>
                    <b:Corporate>risques-pme.fr</b:Corporate>
                </b:Author>
            </b:Author>
            <b:Title>Stress, charge de travail et risque professionnel</b:Title>
            <b:URL>http://www.risques-pme.fr/les-risques-particuliers/stress-et-charge-de-travail.aspx</b:URL>
            <b:Comments>Pas utilisé</b:Comments>
            <b:RefOrder>1</b:RefOrder>
        </b:Source>
        <b:Source>
            <b:Tag>ARN12</b:Tag>
            <b:SourceType>InternetSite</b:SourceType>
            <b:Guid>{C94A21CC-2EF0-4CDB-AA3C-78CAD982650D}</b:Guid>
            <b:LCID>0</b:LCID>
            <b:Author>
                <b:Author>
                    <b:NameList>
                        <b:Person>
                            <b:Last>ARNAUD</b:Last>
                            <b:First>Didier</b:First>
                        </b:Person>
                    </b:NameList>
                </b:Author>
            </b:Author>
            <b:Title>Le stress, une méthode de management comme une autre ?</b:Title>
            <b:Year>2012</b:Year>
            <b:Month>novembre</b:Month>
            <b:Day>18</b:Day>
            <b:URL>http://www.liberation.fr/economie/2012/11/18/le-stress-une-methode-de-management-comme-une-autre_861369</b:URL>
            <b:Comments>pas utilisé</b:Comments>
            <b:RefOrder>2</b:RefOrder>
        </b:Source>
    </b:Sources>
    Certains reconnaitrons les bibliographies Word.

    Si quelqu'un pourrait m'expliquer ce que j'ai raté dans mon xslt, ce serait sympa.

  2. #2
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 557
    Points : 21 616
    Points
    21 616
    Par défaut
    <xsl:sort> ne peut être utilisé que immédiatement au début d'une boucle <xsl:for-each>.
    Tu ne peux pas mettre une <xsl:variable> avant. Ni quoi que ce soit d'autre.

    "Du coup, comment je fais pour simplifier le calcul du tri avec des variables ?"
    => Ben tu peux pas.

    "Du coup comment je fais pour indiquer au <xsl:sort> sur quoi il doit trier au juste ?"
    => En XSLT 2.0 il y a moyen de le faire avec des expressions conditionnelles super compliqués. En XSLT 1.0, ben tu peux pas.

    "Du coup comment je fais mon tri ?"
    => En XSLT 2.0 tu pourrais construire une liste d'objets à trier, avec une propriété unifiée sur laquelle trier, ce qui simplifie le <xsl:sort>.
    En XSLT 1.0 ce n'est possible qu'avec une combinaison de templates récursifs exagérément compliqués.

    Conclusion : XSLT n'est pas le bon outil pour juste trier des éléments hétérogènes. Fais-le avec un langage de programmation. Java, C#, Python, on s'en fout, un langage de programmation.
    Au pire, si tu as aussi besoin de faire de faire une transformation du document, tu peux le faire en deux temps : d'abord trier le document avec un langage de programmation, puis le transformer avec XSLT.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

Discussions similaires

  1. Problème de tri sur une PRIMARY KEY
    Par dudu92 dans le forum Oracle
    Réponses: 9
    Dernier message: 19/06/2007, 12h12
  2. [C#] Problème de tri sur datagrid
    Par arnauann dans le forum Windows Forms
    Réponses: 2
    Dernier message: 16/04/2007, 02h24
  3. Réponses: 3
    Dernier message: 21/09/2006, 15h55
  4. Problème de tri sur les dates par année puis mois
    Par rob2-9 dans le forum Access
    Réponses: 26
    Dernier message: 11/08/2006, 11h04
  5. [VB.NET] Problème de tri sur Datagrid/gridview multilingue
    Par crimsonPhantom dans le forum ASP.NET
    Réponses: 4
    Dernier message: 16/03/2006, 22h41

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