Discussion: XSLT + XSL FO

  1. #1
    Membre à l'essai
    Inscrit en
    octobre 2009
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : octobre 2009
    Messages : 11
    Points : 10
    Points
    10

    Par défaut XSLT + XSL FO

    Bonjour à tous,

    Je suis une débutante dans l'XSLT 1.0 et je suis bloquée depuis des jours sur quelque chose. Je vous explique donc et vous remercie déjà pour votre aide!

    J'aimerais que sur mon pdf, tous les <label_FR> du même <status@valuetext='Confirmé'> soient regroupés l'un à la suite de l'autre sous un même titre Confirmé:
    Et ainsi de suite pour les autres valeurs du statut (Infirmé, suspecté) mais dans ce bout d'XML je n'ai l'exemple de de deux statuts Confirmés.

    Actuellement, tous les <label_FR> s'affichent mais sans tri et sans regroupement. Comme ceci:

    Allergie(s):
    Confirmé(s) :
    Lait
    desc lait
    Infirmé(s) :
    Fraises
    stat inf desc
    Confirmé(s) :
    Blanc d'oeuf
    st conf desssssz

    Alors que j'aimerais arriver à:

    Allergie(s):
    Confirmé(s) :
    Lait
    desc lait
    Blanc d'oeuf
    st conf desssssz
    Infirmé(s) :
    Fraises
    stat inf desc



    Voici le bout de l'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
    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
     	<subreport ver="24" descr="Allergies (fiche santé)" name="SOUS_RAPPORT_ALLERGIES" dateCreation="Mar 06/02" heureCreation="11:51" userCreate="gg">
    		<ce_atcd_med newline="1" title="1" style="lbl" label="&lt;a style="background:lightgreen"&gt;Allergie(s)" unformattedLabel=" Allergie(s):" isModified="0" toPrint="1" indentation="0£2" xmlStyle="B" nextField=""/>
    		<dStart newline="0" title="0" style="date" label="Date de début" unformattedLabel="" isModified="0" toPrint="0" indentation="3" xmlStyle="N£N" nextField="">06/02/2018</dStart>
    		<list style="chk" label="Actif" unformattedLabel="" toPrint="0" indentation="0" xmlStyle="" nextField="">
    			<active newline="0" style="chk" label="" unformattedLabel="" isModified="0" value="1" toPrint="1" nextField="">on</active>
    		</list>
    		<status newline="0" title="0" style="cmb" label="Statut" unformattedLabel="" isModified="0" toPrint="0" indentation="0" xmlStyle="" nextField="" valuetext="Confirmé">VA</status>
    		<dicoLibel newline="0" title="1" style="lbl" label="Libellé" unformattedLabel="" isModified="0" toPrint="0" indentation="0" xmlStyle="" nextField=""/>
    		<dico newline="0" title="0" style="dico" label="" unformattedLabel="" isModified="0" toPrint="1" indentation="3" xmlStyle="" nextField="">
    			<entry entrynum="1">
    				<code>Al012</code>
    				<label_FR>Lait</label_FR>
    				<label_EN/>
    				<label_NL/>
    			</entry>
    		</dico>
    		<commentLibel newline="0" title="1" style="lbl" label="Description" unformattedLabel="" isModified="0" toPrint="0" indentation="0" xmlStyle="" nextField=""/>
    		<text newline="0" title="0" style="txtArea" label="" unformattedLabel="" isModified="0" toPrint="1" indentation="3" xmlStyle="" nextField="">desc lait</text>
    	</subreport>
    	<subreport ver="24" descr="Allergies (fiche santé)" name="SOUS_RAPPORT_ALLERGIES" dateCreation="Mar 06/02" heureCreation="11:51" userCreate="gg">
    		<ce_atcd_med newline="1" title="1" style="lbl" label="&lt;a style="background:lightgreen"&gt;Allergie(s)" unformattedLabel=" Allergie(s):" isModified="0" toPrint="1" indentation="0£2" xmlStyle="B" nextField=""/>
    		<dStart newline="0" title="0" style="date" label="Date de début" unformattedLabel="" isModified="0" toPrint="0" indentation="3" xmlStyle="N£N" nextField="">06/02/2018</dStart>
    		<list style="chk" label="Actif" unformattedLabel="" toPrint="0" indentation="0" xmlStyle="" nextField="">
    			<active newline="0" style="chk" label="" unformattedLabel="" isModified="0" value="1" toPrint="1" nextField="">on</active>
    		</list>
    		<status newline="0" title="0" style="cmb" label="Statut" unformattedLabel="" isModified="0" toPrint="0" indentation="0" xmlStyle="" nextField="" valuetext="Infirmé">I</status>
    		<dicoLibel newline="0" title="1" style="lbl" label="Libellé" unformattedLabel="" isModified="0" toPrint="0" indentation="0" xmlStyle="" nextField=""/>
    		<dico newline="0" title="0" style="dico" label="" unformattedLabel="" isModified="0" toPrint="1" indentation="3" xmlStyle="" nextField="">
    			<entry entrynum="1">
    				<code>Al052</code>
    				<label_FR>Fraises</label_FR>
    				<label_EN/>
    				<label_NL/>
    			</entry>
    		</dico>
    		<commentLibel newline="0" title="1" style="lbl" label="Description" unformattedLabel="" isModified="0" toPrint="0" indentation="0" xmlStyle="" nextField=""/>
    		<text newline="0" title="0" style="txtArea" label="" unformattedLabel="" isModified="0" toPrint="1" indentation="3" xmlStyle="" nextField="">stat inf desc</text>
    	</subreport>
    	<subreport ver="24" descr="Allergies (fiche santé)" name="SOUS_RAPPORT_ALLERGIES" dateCreation="Mar 06/02" heureCreation="11:51" userCreate="gg">
    		<ce_atcd_med newline="1" title="1" style="lbl" label="&lt;a style="background:lightgreen"&gt;Allergie(s)" unformattedLabel=" Allergie(s):" isModified="0" toPrint="1" indentation="0£2" xmlStyle="B" nextField=""/>
    		<dStart newline="0" title="0" style="date" label="Date de début" unformattedLabel="" isModified="0" toPrint="0" indentation="3" xmlStyle="N£N" nextField="">06/02/2018</dStart>
    		<list style="chk" label="Actif" unformattedLabel="" toPrint="0" indentation="0" xmlStyle="" nextField="">
    			<active newline="0" style="chk" label="" unformattedLabel="" isModified="0" value="1" toPrint="1" nextField="">on</active>
    		</list>
    		<status newline="0" title="0" style="cmb" label="Statut" unformattedLabel="" isModified="0" toPrint="0" indentation="0" xmlStyle="" nextField="" valuetext="Confirmé">VA</status>
    		<dicoLibel newline="0" title="1" style="lbl" label="Libellé" unformattedLabel="" isModified="0" toPrint="0" indentation="0" xmlStyle="" nextField=""/>
    		<dico newline="0" title="0" style="dico" label="" unformattedLabel="" isModified="0" toPrint="1" indentation="3" xmlStyle="" nextField="">
    			<entry entrynum="1">
    				<code>Al052</code>
    				<label_FR>Blanc d&apos;oeuf</label_FR>
    				<label_EN/>
    				<label_NL/>
    			</entry>
    		</dico>
    		<commentLibel newline="0" title="1" style="lbl" label="Description" unformattedLabel="" isModified="0" toPrint="0" indentation="0" xmlStyle="" nextField=""/>
    		<text newline="0" title="0" style="txtArea" label="" unformattedLabel="" isModified="0" toPrint="1" indentation="3" xmlStyle="" nextField="">st conf desssssz</text>
    	</subreport>
    Voici mon bout de code de l'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
    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
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
     <xsl:when test="@style='dico'">
    						<xsl:if test="contains($xmlStyle, 'P')">
    							<xsl:call-template name="NewPage"/>
    						</xsl:if>
    						<!-- GG: Ajout de la ligne du statut -->
     
     
     
    						<xsl:choose>
    							<xsl:when test="parent::subreport/status/@valuetext='Confirmé'">
    								<fo:block text-decoration="underline">
    									<xsl:text> Confirmé(s) : </xsl:text>
    								</fo:block>
     
     
    								<fo:block>
     
    									<xsl:for-each select="entry/label_FR">
    										<xsl:call-template name="writeelement_withlabel">
    											<xsl:with-param name="champ_libelle" select="../.."/>
    											<xsl:with-param name="champ_texte" select="."/>
    											<xsl:with-param name="lib_bold" select="'bold'"/>
    											<xsl:with-param name="lib_underline" select="'underline'"/>
    											<xsl:with-param name="marge">
    												<xsl:value-of select="$marge_def"/>
    											</xsl:with-param>
    											<xsl:with-param name="padding">
    												<xsl:value-of select="$paddingTop_def"/>
    											</xsl:with-param>
    											<xsl:with-param name="xmlStyle" select="$xmlStyle"/>
    										</xsl:call-template>
     
    									</xsl:for-each>
     
    								</fo:block>
     
     
    							</xsl:when>	
     
     
     
    							<xsl:when test="parent::subreport/status/@valuetext='Suspecté'">
    								<fo:block text-decoration="underline">
    									<xsl:text> Suspecté(s) : </xsl:text>
    								</fo:block>
    								<xsl:for-each select="entry/label_FR">
    									<xsl:call-template name="writeelement_withlabel">
    										<xsl:with-param name="champ_libelle" select="../.."/>
    										<xsl:with-param name="champ_texte" select="."/>
    										<xsl:with-param name="lib_bold" select="'bold'"/>
    										<xsl:with-param name="lib_underline" select="'underline'"/>
    										<xsl:with-param name="marge">
    											<xsl:value-of select="$marge_def"/>
    										</xsl:with-param>
    										<xsl:with-param name="padding">
    											<xsl:value-of select="$paddingTop_def"/>
    										</xsl:with-param>
    										<xsl:with-param name="xmlStyle" select="$xmlStyle"/>
    									</xsl:call-template>
    								</xsl:for-each>
    							</xsl:when>
    							<xsl:when test="parent::subreport/status/@valuetext='Infirmé'">
    								<fo:block text-decoration="underline">
    									<xsl:text> Infirmé(s) : </xsl:text>
    								</fo:block>
    								<xsl:for-each select="entry/label_FR">
    									<xsl:call-template name="writeelement_withlabel">
    										<xsl:with-param name="champ_libelle" select="../.."/>
    										<xsl:with-param name="champ_texte" select="."/>
    										<xsl:with-param name="lib_bold" select="'bold'"/>
    										<xsl:with-param name="lib_underline" select="'underline'"/>
    										<xsl:with-param name="marge">
    											<xsl:value-of select="$marge_def"/>
    										</xsl:with-param>
    										<xsl:with-param name="padding">
    											<xsl:value-of select="$paddingTop_def"/>
    										</xsl:with-param>
    										<xsl:with-param name="xmlStyle" select="$xmlStyle"/>
    									</xsl:call-template>
    								</xsl:for-each>
    							</xsl:when>
    							<xsl:otherwise>
    							<xsl:for-each select="entry/label_FR">
    							<xsl:call-template name="writeelement_withlabel">
    								<xsl:with-param name="champ_libelle" select="../.."/>
    								<xsl:with-param name="champ_texte" select="."/>
    								<xsl:with-param name="lib_bold" select="'bold'"/>
    								<xsl:with-param name="lib_underline" select="'underline'"/>
    								<!--xsl:with-param name="deux-points" select="false()"/-->
    								<xsl:with-param name="marge">
    									<xsl:value-of select="$marge_def"/>
    								</xsl:with-param>
    								<xsl:with-param name="padding">
    									<xsl:value-of select="$paddingTop_def"/>
    								</xsl:with-param>
    								<xsl:with-param name="xmlStyle" select="$xmlStyle"/>
    							</xsl:call-template>
    						</xsl:for-each>
     
    							</xsl:otherwise>
    						</xsl:choose>
    					</xsl:when>

  2. #2
    Membre à l'essai
    Inscrit en
    octobre 2009
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : octobre 2009
    Messages : 11
    Points : 10
    Points
    10

    Par défaut

    Personne n'a une piste à me proposer????

  3. #3
    Membre actif
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    avril 2007
    Messages
    174
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : avril 2007
    Messages : 174
    Points : 252
    Points
    252

    Par défaut

    As-tu consulté cette page ? méthode regroupement Muench.
    "Chuck Norris a déjà compté jusqu'à l'infini. Deux fois."

  4. #4
    Membre à l'essai
    Inscrit en
    octobre 2009
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : octobre 2009
    Messages : 11
    Points : 10
    Points
    10

    Par défaut

    Merci, je vais tenter!

  5. #5
    Membre chevronné
    Inscrit en
    octobre 2011
    Messages
    1 217
    Détails du profil
    Informations forums :
    Inscription : octobre 2011
    Messages : 1 217
    Points : 2 132
    Points
    2 132

    Par défaut

    Puisque en tout cas toute valeur possible de label_FR est désirée et traitée, le plus simple de regroupement dans le sens l'une après l'autre comme si elles sont indépendantes, sans aucun calcul d'agrégation ou d'autres dedans un groupe, le plus simple d'achever le but est de faire un tri (xsl:sort) sur la valeur de subreport/status/@valuetext ...
    Supposons le code xsl:when montré soit dans un template matchant subreport.
    Code xslt : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    <xsl:template match="subreport">
        <!-- etc etc -->
        <xsl:for-each select="dico">
            <!-- etc etc -->
            <xsl:when test="@style='dico'">
                <!-- le code montré -->
            </xsl:when>
        </xsl:for-each>
        <!-- etc etc -->
    </xsl:template>
    Et ce template soit appelé par un xsl:apply-templates de par un autre template qui matche le parent des balises subreport: supposons que le parent soit nommé report.
    Code xslt : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <xsl:template match="report">
        <!-- etc etc -->
        <xsl:apply-templates select="subreport" />
        <!-- etc etc -->
    </xsl:template>
    On veut briser l'ordre dit documentaire des subreports - c'est le but. On peut faire comme ceci.
    Code xslt : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    <xsl:template match="report">
        <!-- etc etc -->
        <xsl:apply-templates select="subreport">
            <xsl:sort select="status/@valuetext" />
        </xsl:apply-template>
        <!-- etc etc -->
    </xsl:template>
    Le résultat serait que des subreports avec son status/@valuetext Confirmé ou Infirmé ou Suspecté soient regroupées dans l'ordre Confirmé, ... , Confirmé, Infirmé, ..., Infirmé, Suspecté, ..., Suspecté. L'ordre s'est donc transformé en pratique le regroupement désiré.

    Je raisonne dans l'abstract profond et, par conséquence, je peux me tromper dans le détail à cause du manque des informations détaillées et explicites sur les templates actuellement écrits et aussi sur le structure globale du document xml traité. Mais c'est l'idée conductrice pour faire ce que vous voulez faire.

    Et puis, on peut faire bien sûr, si le code existant dicté, une équivalente en utilisant xsl:sort couplé avec certain <xsl:for-each select="subreport"> et ce n'est pas trop difficile de refaire cette écriture d'après l'autre. C'est à vous de jouer.

    Voilà !

Discussions similaires

  1. [XSLT] XSL unique pour structure XML différente.
    Par SONY30 dans le forum XSL/XSLT/XPATH
    Réponses: 5
    Dernier message: 24/10/2006, 10h08
  2. [XSLT] xsl:import ou xsl:include
    Par SONY30 dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 22/09/2006, 08h42
  3. [XSLT]xsl parsing + max
    Par pierre-yves de brito dans le forum XSL/XSLT/XPATH
    Réponses: 6
    Dernier message: 05/07/2006, 15h23
  4. [XSLT] <xsl:if> test sur plusieurs condition
    Par oxilab dans le forum XSL/XSLT/XPATH
    Réponses: 8
    Dernier message: 30/06/2006, 20h30
  5. [XSLT] Xsl:number arrondi
    Par virgul dans le forum XSL/XSLT/XPATH
    Réponses: 5
    Dernier message: 15/06/2005, 10h55

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