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 :

groupement optimisé de séquence pour table de taille n [Sources]


Sujet :

XSL/XSLT/XPATH XML

  1. #1
    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 : 50
    Localisation : France, Gironde (Aquitaine)

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

    Informations forums :
    Inscription : Octobre 2009
    Messages : 1 460
    Points : 2 371
    Points
    2 371
    Par défaut groupement optimisé de séquence pour table de taille n
    Bonjour,

    J'ai un ensemble de noeuds :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    <x:row type='1'/>        1 élément @type='1'
    <x:row type='2'/>        pour x éléments @type='2'
    <x:row type='empty'/>        et 1 élément @type='empty'
     
    etc. cela se répète y fois.
    Je cherche à placer un maximum d'ensemble de noeuds du type 1, 2 et empty dans un tableau de n lignes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    <x:table nombreDeLignes="n">
    <x:row type='1'/>        1 élément @type='1'
    <x:row type='2'/>        pour x éléments @type='2'
    <x:row type='empty'/>        et 1 élément @type='empty'
    </x:table>
    En vous remerciant de votre aide
    Article : Installation de Cocoon
    Je ne réponds pas aux MP à caractère technique.

  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
    Un maximum ? C'est-à-dire, chaque répétition de l'ensemble montré doit se retrouver encadré de

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <x:table nombreDeLignes="n">...</x:table>
    ?
    Autrement dit, il y aurait y éléments <x:table> ?

    Si c'est le cas, c'est un de ces cas chiants.
    Une manière de le voir est de faire un Muench, dont le match porte sur <x:row> et le use porte sur un generate-id() du <x:row type="1"> qui commence la séquence.
    Pas évident mais ça se fait.

    Attention toutefois, j'ai déjà essayé de faire ce genre de trucs avec le moteur XSLT de base de Java, et il y a une anomalie quand on se sert de generate-id() dans le use, du coup ça ne marche pas.
    Avec Saxon ça passe très bien.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    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
    tu pourrais donner un exemple plus parlant parce que je ne comprends pas du tout le problème

  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 : 50
    Localisation : France, Gironde (Aquitaine)

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

    Informations forums :
    Inscription : Octobre 2009
    Messages : 1 460
    Points : 2 371
    Points
    2 371
    Par défaut
    Voici un exemple plus concret :

    Mon ensemble de noeuds :
    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
     
    <!-- Premier sous-ensemble composé de 4 éléments -->
    <x:row type='1'/>        
    <x:row type='2'/>        
    <x:row type='2'/> 
    <x:row type='empty'/>    
     
    <!-- Deuxième sous-ensemble composé de 3 éléments -->
    <x:row type='1'/>        
    <x:row type='2'/>        
    <x:row type='empty'/>  
     
    <!-- Troisième sous-ensemble composé de 6 éléments -->
    <x:row type='1'/>        
    <x:row type='2'/>        
    <x:row type='2'/> 
    <x:row type='2'/>        
    <x:row type='2'/> 
    <x:row type='empty'/>  
     
    <!-- Quatrième sous-ensemble composé de 5 éléments -->
    <x:row type='1'/>        
    <x:row type='2'/>        
    <x:row type='2'/> 
    <x:row type='2'/>        
    <x:row type='empty'/>
    Et voici le résultat que je doit obtenir :

    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
     
    <!-- Dans ce premier tableau, je peux insérer les deux premiers sous-ensembles de noeuds, mais pas le troisième sous-ensemble. 
    En effet, le premier sous-ensemble comprend 4 éléments et on a 4 <= 7, 
    pour le deuxième ensemble de noeuds, on a 4 + 3 <= 7,
    mais pour le troisième sous-ensemble, on a 4 + 3 + 6 > 7. -->
    <x:table nombreDeLignes="7">
    <x:row type='1'/>        
    <x:row type='2'/>        
    <x:row type='2'/> 
    <x:row type='empty'/>        
    <x:row type='1'/>        
    <x:row type='2'/>        
    <x:row type='empty'/>  
    </x:table>
     
    <!-- Dans ce deuxième tableau, je ne peux insérer que 
    le troisième sous-ensemble de noeuds puisque 6 <= 7 
    et que le quatrième sous-ensemble est trop grand 
    puisque on a 6 + 5 > 7 -->
    <x:table nombreDeLignes="7">
    <x:row type='1'/>        
    <x:row type='2'/>        
    <x:row type='2'/> 
    <x:row type='2'/>        
    <x:row type='2'/> 
    <x:row type='empty'/>  
    </x:table>
     
    <!-- Finalement, j'insère le quatrième sous-ensemble de noeuds dans un dernier tableau puisqu'il ne pouvait être contenu dans le tableau précédant -->
    <x:table nombreDeLignes="7">
    <x:row type='1'/>        
    <x:row type='2'/>        
    <x:row type='2'/> 
    <x:row type='2'/>        
    <x:row type='empty'/>  
    </x:table>
    J'ai bien entendu penser à Muench, mais sans avoir pu trouver de résultat !
    Article : Installation de Cocoon
    Je ne réponds pas aux MP à caractère technique.

  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
    tes regroupements sont traités de façon séquentielle ou "optimisé" (minimum de table par exemple) ?

    Pas du tout du muench là en tout cas, même pas sur que les clés nous servent à quelque chose

  6. #6
    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 : 50
    Localisation : France, Gironde (Aquitaine)

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

    Informations forums :
    Inscription : Octobre 2009
    Messages : 1 460
    Points : 2 371
    Points
    2 371
    Par défaut
    Je dois obtenir un minimum de tableau, dit d'une autre façon, je dois mettre un maximum de sous-ensembles par tableau
    Article : Installation de Cocoon
    Je ne réponds pas aux MP à caractère technique.

  7. #7
    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
    L'approche séquentielle est faisable en xslt 1.0, l'approche optimisé me paraît très douteuse.

  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
    Bon après quelques tests ça me semble faisable et on a bien besoin des clés (en tout cas tel que je l'écris).

    Commence à me faire vieux

    Va me falloir un peu de temps pour écrire l'exemple par contre.

  9. #9
    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
    Bon après une petite pause déjeuner pour alimenter mon cerveau fatigué j'ai une solution à proposer

    Il y a sans doute mieux et il faudrait mieux la tester sur plus de cas mais je n'ai pas trop le temps (détail, j'ai remplacé tes x:row par row, plus simple pour travailler)

    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
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    <?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:key name="group" match="row[@type!=1]" use="generate-id(preceding-sibling::*[@type=1][position()=1])"/>
    	<xsl:variable name="ligne" select="7"/>
    	<xsl:variable name="taille_min_group" select="3"/>
    	<xsl:template match="test">
    		<test>
    			<xsl:call-template name="ajout">
    				<xsl:with-param name="liste" select="/*/row[@type=1]"/>
    				<xsl:with-param name="taille" select="$ligne"/>
    			</xsl:call-template>
    		</test>
    	</xsl:template>
    	<xsl:template name="ajout">
    		<xsl:param name="liste"/>
    		<xsl:param name="taille"/>
    		<xsl:param name="table"/>
    		<xsl:param name="taillePrec" select="0"/>
    		<xsl:choose>
    			<xsl:when test="$liste[1]">
    				<xsl:choose>
    					<xsl:when test="$liste[(count(key('group',generate-id(.)))+1)=$taille]">
    						<xsl:variable name="noeud">
    							<xsl:copy-of select="$table"/>
    							<xsl:for-each select="($liste[(count(key('group',generate-id(.)))+1)=$taille])[1]">
    								<xsl:copy-of select=".|key('group',generate-id(.))"/>
    							</xsl:for-each>
    						</xsl:variable>
    						<xsl:choose>
    							<xsl:when test="($taille + $taillePrec + $taille_min_group) &lt; ($ligne +1)">
    								<xsl:call-template name="ajout">
    									<xsl:with-param name="liste" select="$liste[generate-id(.)!=generate-id(($liste[(count(key('group',generate-id(.)))+1)=$taille])[1])]"/>
    									<xsl:with-param name="taille" select="$ligne - ($taille + $taillePrec)"/>
    									<xsl:with-param name="taillePrec" select="($taille + $taillePrec)"/>
    									<xsl:with-param name="table" select="$noeud"/>
    								</xsl:call-template>
    							</xsl:when>
    							<xsl:otherwise>
    								<table>
    									<xsl:copy-of select="$noeud"/>
    								</table>
    								<xsl:call-template name="ajout">
    							<xsl:with-param name="liste" select="$liste[generate-id(.)!=generate-id(($liste[(count(key('group',generate-id(.)))+1)=$taille])[1])]"/>
    							<xsl:with-param name="taille" select="$taille"/>
    							<xsl:with-param name="taillePrec" select="0"/>
    						</xsl:call-template>
    								</xsl:otherwise>	
    						</xsl:choose>
     
    					</xsl:when>
    					<xsl:otherwise>
    						<xsl:call-template name="ajout">
    							<xsl:with-param name="liste" select="$liste"/>
    							<xsl:with-param name="taille" select="$taille - 1"/>
    							<xsl:with-param name="taillePrec" select="$taillePrec"/>
    							<xsl:with-param name="table" select="$table"/>
    						</xsl:call-template>
    					</xsl:otherwise>
    				</xsl:choose>
    			</xsl:when>
    			<xsl:otherwise>
    				<xsl:if test="$table">
    					<table>
    						<xsl:copy-of select="$table"/>
    					</table>
    				</xsl:if>
    			</xsl:otherwise>
    		</xsl:choose>
    	</xsl:template>
    </xsl:stylesheet>

  10. #10
    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 : 50
    Localisation : France, Gironde (Aquitaine)

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

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

    tu t'est donné bien de la peine, tu m'aurais expliquer le principe j'aurais déjà été bien content . Merci beaucoup.

    Ceci étant, je vais tester cela dès demain à l'aide mon petit jeu de fichiers XML.
    Article : Installation de Cocoon
    Je ne réponds pas aux MP à caractère technique.

  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
    Citation Envoyé par polymorphisme Voir le message
    tu t'est donné bien de la peine, tu m'aurais expliquer le principe j'aurais déjà été bien content .
    Je n'étais pas sûr de la validité du principe avant de le tester, ce qui l'aurait rendu ardu à expliquer
    Puis ce n'est pas souvent qu'il y a un problème rigolo sur ce forum, bien le droit de m'amuser un peu

  12. #12
    Expert confirmé
    Avatar de Loceka
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    2 276
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 2 276
    Points : 4 845
    Points
    4 845
    Par défaut
    J'ai pas vraiment regardé la solution (mon parseur mental de XSL est un peu mort ce matin) mais je ne pensais même pas qu'il puisse y avoir une solution en XSL. Bravo Erwy !

  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
    Merci.

    Un détail que j'ai oublié, je n'ai pas fait de tri au départ sur les groupes qui sont plus grand que la table, si ce n'est pas fait mon algo plante .

    A faire donc dans le premier appel au template nommé

  14. #14
    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 : 50
    Localisation : France, Gironde (Aquitaine)

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

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

    j'avais noté en effet cela car c'est un cas que je rencontre.
    Article : Installation de Cocoon
    Je ne réponds pas aux MP à caractère technique.

  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
    Citation Envoyé par polymorphisme Voir le message
    c'est un cas que je rencontre.
    Tu le traite comment : en l'ignorant ou le casant quand même dans une table avec des lignes supplémentaires ?

Discussions similaires

  1. InsertCommand pour table avec ID obtenue d'une séquence
    Par rikidude dans le forum Windows Forms
    Réponses: 0
    Dernier message: 21/09/2009, 16h42
  2. Pb pour changer la taille d'un Objet TImage dans une Form
    Par Gouyon dans le forum C++Builder
    Réponses: 10
    Dernier message: 06/06/2006, 18h01
  3. definir chemin pour table liée
    Par branqueira dans le forum Access
    Réponses: 4
    Dernier message: 22/10/2005, 13h44
  4. select pour obtenir la taille de remplissage d'une bdd
    Par sqlakf76 dans le forum MS SQL Server
    Réponses: 9
    Dernier message: 15/07/2005, 13h44
  5. [Séquences] Pour récupérer la dernière valeur
    Par tnodev dans le forum PostgreSQL
    Réponses: 4
    Dernier message: 24/05/2005, 11h35

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