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

XML/XSL et SOAP Discussion :

Largeur de colonne dans un Tableau en Xsl


Sujet :

XML/XSL et SOAP

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2014
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2014
    Messages : 6
    Points : 1
    Points
    1
    Par défaut Largeur de colonne dans un Tableau en Xsl
    Bonjour,
    Je rencontre le problème suivant:
    J'ai plusieurs tableaux dans un Xml avec toutes les informations nécessaire pour le transformer en format Cals destiné à une mise en page dan InDesign.
    Un tableau avec de bonne largeur de colonnes a pour somme des colwidth une valeur de 100%. certain tableau ont des valeur differante et la somme n'arrive pas à 100%. Exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    <Tableau>
      <table pgwide="1" tabstyle="T1">
        <tgroup cols="4">
          <colspec colname="1" colnum="1" colwidth="3*"/>
          <colspec colname="2" colnum="2" colwidth="2*"/>
          <colspec colname="3" colnum="3" colwidth="2*"/>
          <colspec colname="4" colnum="4" colwidth="2*"/>
    ......

    Tableau conforme :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    <Tableau>
      <table pgwide="1" tabstyle="jold">
        <tgroup cols="6">
          <colspec colname="1" colnum="1" colwidth="18.35*"/>
          <colspec colname="2" colnum="2" colwidth="31.23*"/>
          <colspec colname="3" colnum="3" colwidth="17.85*"/>
          <colspec colname="4" colnum="4" colwidth="5.02*"/>
          <colspec colname="5" colnum="5" colwidth="13.06*"/>
          <colspec colname="6" colnum="6" colwidth="14.5*"/>
    ................


    J'ai develloper un Xsl qui prend la valeur avant le * et qui l'inscrit dans une variable $Width_percent, Apres je redefini cette variable qui est exprimé en % en fonction de ma mise en page InDesign qui peut etre sur une pleine page ou sur 2 collonne, cette valeur est exprimé en Pt pleine page 496.062992126 demi page 240.94488189.
    Jusqu'ici tous va bien.

    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
    <!--Calcul de la largeur des colonnes du tableau-->
    	<xsl:template name="largeur_colonne">
    		<xsl:param name="position"/>
    			<xsl:for-each select="ancestor::tgroup/colspec">
    			<xsl:if test="position() = $position">
    				<xsl:variable name="width_percent">
    					<xsl:value-of select="substring-before(@colwidth, '*')"/>
    				</xsl:variable>
    				<xsl:if test="ancestor::table[@pgwide='0']">
    					<xsl:value-of select="(240.94488189 div 100) * $width_percent"/>
    				</xsl:if>
    				<xsl:if test="ancestor::table[@pgwide='1'] | ancestor::table[@tabstyle='joldAbonnements']">
    					<xsl:value-of select="(496.062992126 div 100) * $width_percent"/>
    				</xsl:if>
    			</xsl:if>
    		</xsl:for-each>
    	</xsl:template>
    Maintenant là ou sa ce corse c'est que je souhaite calculer le total des colwidth qui n'arrive pas à 100% et les recalculer avec une regles de 3 en définissant un taux de correction.

    Avez vous une idées sur ce point.
    Merci d'avance

  2. #2
    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
    En XSLT 2.0 on s'en sortirait avec un sum() et un for i in.

    Mais si tu es coincé en XSLT 1.0, sum() ne peut pas ignorer l'étoile et il va falloir trouver autre chose. L'idée serait un template récursif :

    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
    <xsl:template name="widthSum">
      <xsl:param name="elements"/>
      <xsl:param name="index" select="1"/>
      <xsl:param name="currentSum" select="0"/>
     
      <xsl:choose>
        <xsl:when test="not($elements[$index])">
          <xsl:value-of select="$currentSum"/>
        </xsl:when>
        <xsl:otherwise>
          <xsl:call-template name="widthSum">
            <xsl:with-param name="elements" select="elements"/>
            <xsl:with-param name="index" select="$index + 1"/>
            <xsl:with-param name="currentSum" select="$currentSum + $elements[$index]/@width"/>
          </xsl:call-template>
        </xsl:otherwise>
      </xsl:choose>
    </xsl:template>
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Nouveau Candidat au Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2014
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2014
    Messages : 6
    Points : 1
    Points
    1
    Par défaut
    Merci,
    Mais je suis désolé je n'arrive pas à comprendre comment l'intergrer avec ce que j'ai déjà écris ?

  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, il faut l'appeler, en lui donnant en paramètre les éléments à additionner.
    Un peu de la même manière qu'elle s'appelle elle-même.

    Tu sais utiliser <xsl:call-template> il me semble.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  5. #5
    Nouveau Candidat au Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2014
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2014
    Messages : 6
    Points : 1
    Points
    1
    Par défaut
    Javais en attendant une réponse commencé à ecrire celà :

    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
     
    <!--Calcul de la largeur des colonnes du tableau-->
    	<xsl:template name="largeur_colonne">
    		<xsl:param name="position"/>
    			<xsl:for-each select="ancestor::tgroup/colspec">
    			<xsl:if test="position() = $position">
    				<xsl:variable name="width_percent">
    					<xsl:value-of select="substring-before(@colwidth, '*')"/>
    				</xsl:variable>
     
    <!--Création des variables-->
                                      <xsl:variable name="Total_Colwidth">
                                            <xsl:value-of select="sum(//tgroup/colspec/number[substring(@colwidth, '*')])"/>
                                      </xsl:variable>
     
    				<xsl:variable name="Taux_Correctif">
    					<xsl:value-of select="100 div ($Total_Colwidth)"/>					
    				</xsl:variable>
     
    <!--Application-->
                                    <xsl:choose> 
    			           <xsl:when test="ancestor::table[@pgwide='1'] and $Total_Colwidth !=100"> 
    						<xsl:value-of select="(496.062992126 div 100) * $width_percent * $Taux_Correctif"/>
    				   </xsl:when>
    				   <xsl:when test="ancestor::table[@pgwide='0'] and $Total_Colwidth !=100"> 
    						<xsl:value-of select="(240.94488189 div 100) * $width_percent * $Taux_Correctif"/>		
    				    </xsl:when> 						 
    				   <xsl:otherwise> 
    					<xsl:value-of select="(496.062992126 div 100) * $width_percent"/>
    				   </xsl:otherwise> 
                            	</xsl:choose>
    			</xsl:if>
    		</xsl:for-each>
    	</xsl:template>
    Mais rien ne se passe le calcul de tout les colwidth ne se fais, j'ai l'impression qui calcul sur un seul colwidth

  6. #6
    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
    ... Certes. Tu veux bien me montrer, étape par étape, à la main, les résultats du calcul de

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sum(//tgroup/colspec/number[substring(@colwidth, '*')])
    ?

    De toute façon il me semble que je te l'ai déjà dit : en XSLT 1.0 sum() ne peut pas ignorer l'étoile et donc tu ne peux pas t'en servir.
    En 2.0 ce serait autre chose mais bon.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  7. #7
    Nouveau Candidat au Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2014
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2014
    Messages : 6
    Points : 1
    Points
    1
    Par défaut
    Jai remplacé mon resultats par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    				 <xsl:choose> 
    						<xsl:when test="ancestor::table[@pgwide='1'] and $Total_Colwidth !=100"> 
    							<!--<xsl:value-of select="(496.062992126 div 100) * $width_percent * $Taux_Correctif"/>-->
    							<xsl:value-of select="$Total_Colwidth"/>-<xsl:value-of select="$Taux_Correctif"/>-<xsl:value-of select="$width_percent"/>-<xsl:value-of select="100 div ($Total_Colwidth)"/>
    						</xsl:when>
    Voici le resultat en Ouput :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <Tableau aid:pstyle="TableauPleinePage"/><table aid:table="table" aid:trows="8" aid:tcols="4" aid5:tablestyle="TB1">
    						<cell aid:table="cell" aid5:cellstyle="TB3" aid:pstyle="TB8" aid:crows="2" aid:ccols="1" aid:ccolwidth="0-Infinity-39.77-Infinity">PROPRIÉTÉS</cell>
    						<cell aid:table="cell" aid5:cellstyle="TB3" aid:pstyle="TB8" aid:crows="2" aid:ccols="1" aid:ccolwidth="0-Infinity-20.06-Infinity">UNITÉS</cell>
    						<cell aid:table="cell" aid5:cellstyle="TB3" aid:pstyle="TB8" aid:crows="1" aid:ccols="2" aid:ccolwidth="0-Infinity-19.73-Infinity">LIMITES</cell>
    						<cell aid:table="cell" aid5:cellstyle="TB3" aid:pstyle="TB8" aid:crows="1" aid:ccols="1" aid:ccolwidth="0-Infinity-20.44-Infinity">Classe A</cell>

  8. #8
    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
    J'ai dit, à la main. Bon pas grave, je vais le faire.

    Donc, sum(//tgroup/colspec/number[substring(@colwidth, '*')]), appel de la fonction sum() en lui passant un paramètre. Nous devons donc évaluer ce paramètre.
    Le paramètre est //tgroup/colspec/number[substring(@colwidth, '*')], c'est un chemin dont le dernier élément a un prédicat. Évaluons d'abord le chemin.
    //tgroup/colspec/number, donc prendre tous les éléments tgroup du document. Puis garder leurs enfants colspec. Et eux, garder leurs enfants number.
    Il n'y a pas d'élément <number> dans le document, donc rien n'est sélectionné.
    Un prédicat sur l'ensemble vide donnera toujours l'ensemble vide, donc inutile de l'appliquer.
    sum() sur l'ensemble vide donne zéro. Donc le résultat est zéro.

    ... Et si tu divises quelque chose par zéro ça fait l'infini, d'où les résultats observés.
    Bref, il était clair depuis le début que ce xpath ne peut pas faire ce dont tu as besoin.

    Je te l'ai déjà dit, en XSLT 1.0 tu ne pourras pas utiliser sum().
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  9. #9
    Nouveau Candidat au Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2014
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2014
    Messages : 6
    Points : 1
    Points
    1
    Par défaut
    Salut Thelvin,

    Oui en effet j'ai fais des erreurs et j'ai bien compris que sum en 1.0 sa le fais pas.
    Je vais revoir le calcul en utilisant ce que tu ma conseillé.
    Merci

  10. #10
    Nouveau Candidat au Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2014
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2014
    Messages : 6
    Points : 1
    Points
    1
    Par défaut
    Thevin : a quoi correspond index et elements dans mon cas de figure ?

    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
    <xsl:template name="widthSum">
      <xsl:param name="elements"/>
      <xsl:param name="index" select="1"/>
      <xsl:param name="currentSum" select="0"/>
     
      <xsl:choose>
        <xsl:when test="not($elements[$index])">
          <xsl:value-of select="$currentSum"/>
        </xsl:when>
        <xsl:otherwise>
          <xsl:call-template name="widthSum">
            <xsl:with-param name="elements" select="elements"/>
            <xsl:with-param name="index" select="$index + 1"/>
            <xsl:with-param name="currentSum" select="$currentSum + $elements[$index]/@width"/>
          </xsl:call-template>
        </xsl:otherwise>
      </xsl:choose>
    </xsl:template>

  11. #11
    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
    L'ensemble des éléments dont tu veux additionner quelque chose. Ici les colspec
    La position d'un élément dans cet ensemble. Va de 1, la première valeur, à count($elements)+1 où il ne trouve donc plus d'élément et sait qu'il doit s'arrêter.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

Discussions similaires

  1. alterner les couleurs dans un tableau avec xsl
    Par Eithelgul dans le forum XSL/XSLT/XPATH
    Réponses: 14
    Dernier message: 03/05/2015, 23h29
  2. Modifier une largeur de colonnes d'un tableau dans une listbox
    Par grimgrim dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 26/05/2014, 08h28
  3. largeur de colonne dans une zone de liste
    Par fsautejeau dans le forum Access
    Réponses: 2
    Dernier message: 25/08/2006, 13h29
  4. [Visual Web] [SJSC] Ajout de colonne dans un tableau
    Par vincent77320 dans le forum NetBeans
    Réponses: 4
    Dernier message: 12/06/2006, 11h44
  5. Masquer des colonnes dans un tableau
    Par fornorst dans le forum Général JavaScript
    Réponses: 10
    Dernier message: 26/04/2006, 21h00

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