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 :

[XSL-FO] vers html et namespace fo


Sujet :

XSL/XSLT/XPATH XML

  1. #1
    Membre averti Avatar de titouille
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    353
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2005
    Messages : 353
    Points : 356
    Points
    356
    Par défaut [XSL-FO] vers html et namespace fo
    Bonjour à tous !

    petite question... j'ai un fichier qui est un "fragment" xsl-fo 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
    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
     
    <fo:block font-family='Arial' font-size='11px' padding-bottom='10px' text-align='justify' break-after='page' id='s1_p11_fr'>
     
    	<fo:marker marker-class-name='page-title'>Préliminaires</fo:marker>
    	<fo:marker marker-class-name='section-page'>1.11</fo:marker>
    	<fo:marker marker-class-name='section-page-indice'>.a</fo:marker>
    	<fo:marker marker-class-name='nextIndex'>b</fo:marker>
    	<fo:marker marker-class-name='next'>
    		<fo:external-graphic src='[ASSETS_PATH]arrow.png' width='26px' height='13px' content-width='scale-to-fit' content-height='scale-to-fit' />
    	</fo:marker>
     
    	<fo:block-container padding-top='10px'>
    		<fo:block font-family='Arial Black' font-weight='bold' padding-bottom='2px'>1. GENERALITÉS</fo:block>
    		<fo:block-container margin-left='6px'>
    			<fo:block padding-top='2px'>Le présent catalogue "<fo:inline font-family='Arial Black' font-weight='bold'>FONTES DE VOIRIE</fo:inline>" a été conçu spécialement pour l'ingénieur, l'architecte, l'entrepreneur. Il se veut un instrument simple et pratique pour orienter son utilisateur sur le choix le plus judicieux et le mieux adapté à chaque cas spécifique.</fo:block>
    			<fo:block padding-top='2px'>Il annule et remplace toutes les éditions précédentes.</fo:block>
    			<fo:block padding-top='2px'>Toutes les dimensions sont indiquées en millimètres. Les poids le sont à titre indicatifs.</fo:block>						
    		</fo:block-container>
    	</fo:block-container>
     
    	<fo:block-container padding-top='30px'>
    		<fo:block font-family='Arial Black' font-weight='bold' padding-bottom='2px'>2. NORMALISATION ET UTILISATION</fo:block>
    		<fo:block-container margin-left='6px'>
    			<fo:block padding-top='2px'>Les éléments correspondent pour la plupart aux exigences de la norme européenne <fo:inline font-family='Arial Black' font-weight='bold'>X</fo:inline> ainsi qu’à la norme suisse <fo:inline font-family='Arial Black' font-weight='bold'>Y</fo:inline></fo:block>
    			<fo:block padding-top='2px'>Les produits de notre entreprise sont généralement soumis aux normes ou aux recommandations de l'association VSS, ainsi qu'à toutes celles de la SNV (Société suisse de normalisation) et de la SIA (Société suisse des ingénieurs et architectes).</fo:block>
    		</fo:block-container>
    	</fo:block-container>
    </fo:block>
     
    <fo:block font-family='Arial' font-size='11px' text-align='justify' break-after='page'>
    	<fo:marker marker-class-name='page-title'>Préliminaires</fo:marker>
    	<fo:marker marker-class-name='section-page'>1.11</fo:marker>
    	<fo:marker marker-class-name='section-page-indice'>.b</fo:marker>
    	<fo:marker marker-class-name='nextIndex'>c</fo:marker>
    	<fo:marker marker-class-name='next'>
    		<fo:external-graphic src='[ASSETS_PATH]arrow.png' width='26px' height='13px' content-width='scale-to-fit' content-height='scale-to-fit' />
    	</fo:marker>
     
    	<fo:block-container padding-top='10px'>
    		<fo:block font-family='Arial Black' font-weight='bold' padding-bottom='2px'>3. GUIDES D'UTILISATION</fo:block>
    		<fo:block-container margin-left='6px'>
    			<fo:block padding-top='2px'>L'ingénieur, l'architecte, l'entrepreneur ou toute autre personne chargée du choix ou de l'installation utilisera les documents suivants pour déterminer quel produit convient le mieux au cas particulier qui lui est posé :</fo:block>
    				<fo:list-block provisional-distance-between-starts="10px" space-before.optimum="3px">
    					<fo:list-item padding-top='2px'>
    						<fo:list-item-label end-indent="label-end()"><fo:block>&#x2022;</fo:block></fo:list-item-label>
    						<fo:list-item-body start-indent="body-start()"><fo:block>Le tableau <fo:inline font-family='Arial Black' font-weight='bold'>Normes et Applications (<fo:basic-link color='[LINK_COLOR]' internal-destination='s1_p31_fr'>1.31</fo:basic-link>)</fo:inline> lui permet de déterminer en fonction de sa zone d'utilisation, à quelles sollicitations doit répondre le produit devant être utilisé.</fo:block></fo:list-item-body>
    					</fo:list-item>
    					<fo:list-item padding-top='2px'>
    						<fo:list-item-label end-indent="label-end()"><fo:block>&#x2022;</fo:block></fo:list-item-label>
    						<fo:list-item-body start-indent="body-start()"><fo:block>Les normes <fo:inline font-family='Arial Black' font-weight='bold'>X</fo:inline> et <fo:inline font-family='Arial Black' font-weight='bold'>Y</fo:inline> lui fournissent la notion de <fo:inline font-family='Arial Black' font-weight='bold'>groupes</fo:inline> et de <fo:inline font-family='Arial Black' font-weight='bold'>classes</fo:inline> minimales en fonction des lieux d’installation des dispositifs. Un <fo:inline font-family='Arial Black' font-weight='bold'>schéma et une description</fo:inline> de ceux-ci les explicitent (<fo:inline font-family='Arial Black' font-weight='bold'><fo:basic-link color='[LINK_COLOR]' internal-destination='s1_p41_fr'>1.41</fo:basic-link></fo:inline>)</fo:block></fo:list-item-body>
    					</fo:list-item>
    					<fo:list-item padding-top='2px'>
    						<fo:list-item-label end-indent="label-end()"><fo:block>&#x2022;</fo:block></fo:list-item-label>
    						<fo:list-item-body start-indent="body-start()"><fo:block>Le <fo:inline font-family='Arial Black' font-weight='bold'>Répertoire synoptique (<fo:basic-link color='[LINK_COLOR]' internal-destination='s1_p111_1_a'>1.111 - 1.114</fo:basic-link>)</fo:inline> le guide, à partir des principaux critères qui lui sont connus ou qu'il entend faire respecter, pour choisir le genre d'article correspondant à ses besoins et la référence à rechercher.</fo:block></fo:list-item-body>
    					</fo:list-item>
    					<fo:list-item padding-top='2px'>
    						<fo:list-item-label end-indent="label-end()"><fo:block>&#x2022;</fo:block></fo:list-item-label>
    						<fo:list-item-body start-indent="body-start()"><fo:block>Le <fo:inline font-family='Arial Black' font-weight='bold'>Répertoire numérique par référence (<fo:basic-link color='[LINK_COLOR]' internal-destination='s1_p131_a'>1.131</fo:basic-link>)</fo:inline> et le <fo:inline font-family='Arial Black' font-weight='bold'>Répertoire numérique par page (<fo:basic-link color='[LINK_COLOR]' internal-destination='s1_p132_a'>1.132</fo:basic-link>)</fo:inline> lui donnent la clef d'accès aux fiches techniques sur lesquelles il trouve, pour `chaque modèle, les caractéristiques dimensionnelles, techniques et d'utilisation.</fo:block></fo:list-item-body>
    					</fo:list-item>
    					<fo:list-item padding-top='2px'>
    						<fo:list-item-label end-indent="label-end()"><fo:block>&#x2022;</fo:block></fo:list-item-label>
    						<fo:list-item-body start-indent="body-start()"><fo:block>Des <fo:inline font-family='Arial Black' font-weight='bold'>Tables de conversion (<fo:basic-link color='[LINK_COLOR]' internal-destination='s1_p151_a'>1.151 - 1.155</fo:basic-link>)</fo:inline> sommaires font partie intégrante du présent catalogue. Une version plus élaborée est disponible avec la version internet de notre catalogue.</fo:block></fo:list-item-body>
    					</fo:list-item>
    				</fo:list-block>
    		</fo:block-container>
    	</fo:block-container>
    </fo:block>
    J'aimerai le parser pour en sortir une version HTML. Je récupère donc le contenu de ce fichier, j'y ajoute la balise de départ fo:root avec le namespace xsl:fo. Je passe ensuite le tout à un DOMDocument via loadXML et je lui adjoint le xsl suivant :

    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
     
    <xsl:stylesheet xmlns:xsl='http://www.w3.org/1999/XSL/Transform' 
    		 xmlns:fo='http://www.w3.org/1999/XSL/Format' 
    		 version="1.0">
    <xsl:output encoding="ISO-8859-1"/>
     
     
    <xsl:template match="fo:root">
    	<xsl:apply-templates />
    </xsl:template>
     
    <xsl:template match="fo:block-container">
    	<xsl:variable name="paddingbottom">
    		<xsl:if test="./@padding-bottom != ''">padding-bottom:<xsl:value-of select="./@padding-bottom" />;</xsl:if>
    	</xsl:variable>
    	<xsl:variable name="paddingtop">
    		<xsl:if test="./@padding-top != ''">padding-top:<xsl:value-of select="./@padding-top" />;</xsl:if>
    	</xsl:variable>
    	<div class='container' style="{$paddingbottom}{$paddingtop}">
    		<xsl:apply-templates />
    	</div>
    </xsl:template>	
     
    <xsl:template match="fo:block">
    	<xsl:variable name="size">
    		<xsl:if test="./@font-size != ''">font-size:<xsl:value-of select="./@font-size" />;</xsl:if>
    	</xsl:variable>
    	<xsl:variable name="family">
    		<xsl:if test="./@font-family != ''">font-family:<xsl:value-of select="./@font-family" />;</xsl:if>
    	</xsl:variable>
    	<xsl:variable name="paddingbottom">
    		<xsl:if test="./@padding-bottom != ''">padding-bottom:<xsl:value-of select="./@padding-bottom" />;</xsl:if>
    	</xsl:variable>
    	<div class="block" style="{$size}{$family}{$paddingbottom}">
    		<xsl:apply-templates />
    	</div>
    </xsl:template>
     
    <xsl:template match="fo:list-block">
    	<ul class="list-block">
    		<xsl:apply-templates />
    	</ul>
    </xsl:template>
     
    <xsl:template match="fo:list-item">
    	<li><xsl:value-of select="./fo:list-item-body/fo:block/." /></li>
    </xsl:template>
     
    </xsl:stylesheet>
    J'ai bien en sortie un html plus ou moins valide (il faut encore que je travaille le xsl) mais j'ai un petit souci... Les fo:block de premiers niveau sont transformés en div mais incluent le namespace xsl:fo, exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <div xmlns:fo="http://www.w3.org/1999/XSL/Format" class="block" style="font-size:11px;font-family:Arial;padding-bottom:10px;">
    Je ne comprends pas trop pourquoi... existe-t-il un moyen de supprimer ce namespace ?


    Question subsidiaire : dans mon fragment, vous pouvez voir que j'ai plusieurs fois des marqueurs tels que "page-title". Ils étaient à la base utilisés conjointement avec l'attribut "page-break" afin de récupérer le même titre de page pour plusieurs pages différentes. Maintenant que je suis en mode HTML, je vais afficher tout le contenu sur une seule page, donc plus besoin des marqueurs supplémentaires, seul les marqueurs de début du fragments sont nécessaire.

    Est-il possible de ne parser que le premier marqueur "page-title" et ignorer les autres ? J'ai tenté avec ceci (et quelques variantes) mais je n'y arrive décidément pas...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    <xsl:template match="fo:marker">
    	<xsl:value-of select="count(./@marker-class-name='page-title'(position())=1" />
    	<xsl:if test="./@marker-class-name = 'page-title'">
    	<h1><xsl:value-of select="." /></h1>
    	</xsl:if>
    </xsl:template>
    Un petit peu d'aide serait la bienvenue.


    D'avance merci pour vos suggestions :-)


    Cordialement


    [edit]Oups... je viens de me rendre compte que je n'ai pas posté dans le bon forum, ça aurait été mieux dans xml/xsl/soap... Toutes mes excuses... si un modo passe par là pourrait-il rediriger le post svp[/edit]

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

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

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

    pour supprimer l'espace de nom du document résultant, il suffit d'utiliser l'attribut
    exclude-result-prefixes de l'instruction xsl:stylesheet.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    <xsl:stylesheet  version="1.0"
    xmlns:xsl='http://www.w3.org/1999/XSL/Transform' 
    xmlns:fo='http://www.w3.org/1999/XSL/Format' 
    exclude-result-prefixes="fo">
    Et, pour parser que le premier élément fo:marker, il suffit d'utiliser une expression XPath bien choisie :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    <xsl:template match="fo:marker[1]">
    	<xsl:value-of select="count(./@marker-class-name='page-title'(position())=1" />
    	<xsl:if test="./@marker-class-name = 'page-title'">
    	<h1><xsl:value-of select="." /></h1>
    	</xsl:if>
    </xsl:template>

  3. #3
    Membre averti Avatar de titouille
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    353
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2005
    Messages : 353
    Points : 356
    Points
    356
    Par défaut
    Salut polymorphisme,

    Merci pour ces infos. Concernant le premier problème, c'est réglé avec l'attribut exclude-result-prefixes, comme tu l'as indiqué.

    Concernant le second problème, celui de la récupération du premier élément en ignorant les suivants, ton expression plante... premièrement il doit manquer une parenthèse car il y a 3 ouvrantes pour 2 fermantes... Mais j'ai eu beau essayer différentes combinaisons, je me retrouve toujours avec

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    xsl:value-of : could not compile select expression
    Voilà ce que j'ai compris de ton code :
    à la base, je teste la correspondance avec fo:marker[1] qui est sensé correspondre au premier marqueur, donc "page-title"

    Je fais un if pour être sur de prendre celui qui correspond à "page-title" (mais ça me semble obsolète puisque c'est celui que je sélectionne avec fo:marker[1]...)

    Maintenant c'est la partie que tu as rajoutée que je ne capte pas très bien...

    Premièrement, pourquoi faire un test dans le count (='page-title') puisque c'est de toute façon le marqueur que je cible ?
    Deuxièmement, si je fais un simple "count( ./@marker-class-name ) j'obtiens toujours 1... (je le stocke dans une variable et l'affiche dans mon html). Si je fais la même chose avec cette fois "position()" j'obtiens toujours 2... Je ne capte pas très bien comment utiliser ce "position()" pour obtenir la bonne position par rapport au node en cours...

    Dans le même ordre d'idée : j'ai dans mes fichiers fo des tables qu'on peut voir sous cette forme là :

    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
     
    <fo:table margin-top='2px' table-layout='fixed' width='100%'>
    	<fo:table-column column-width='10%'/>
    	<fo:table-column column-width='90%'/>
    	<fo:table-body>
    		<fo:table-row start-indent='0'>
    			<fo:table-cell><fo:block>Exemple :</fo:block></fo:table-cell>
    			<fo:table-cell><fo:block>Fourniture et pose, à la cote du projet.</fo:block></fo:table-cell>
    		</fo:table-row>
    		<fo:table-row start-indent='0'>
    			<fo:table-cell><fo:block/></fo:table-cell>
    			<fo:table-cell><fo:block>Type 150</fo:block></fo:table-cell>
    		</fo:table-row>
    	</fo:table-body>
    </fo:table>
    J'aimerai, lors du parsing d'une cellule (fo:table-cell), récupérer la largeur de colonne correspondante (fo:table-column).
    Je dois donc jouer avec la position de la cellule (ici 1 ou 2) dans la ligne (fo:table-row) et remonter sur les éléments fo:table-column à la bonne position (1 ou 2) pour récupérer l'attribut column-width (10% ou 90%)...

    Je vais me pencher sur "position()" pour essayer de comprendre son fonctionnement. Si de ton côté tu pouvais me dire pourquoi tu utilises xsl:value-of( "count( ... )" ) sans le stocker nul part pour la suite des évènements, car je ne comprends pas son utilité... on récupère la valeur uniquement si la position du compteur est égale à 1... mais j'ai l'impression qu'on ne récupère rien du tout... est-ce que ça ne serait pas plutôt un xsl:if test="count( ... ) = 1" qu'il faudrai faire ??


    D'avance merci.


    Thierry

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

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

    Informations forums :
    Inscription : Octobre 2009
    Messages : 1 460
    Points : 2 372
    Points
    2 372
    Par défaut
    Bon, je n'ai pas lu le code source en détails, ... détails que je néglige puisque c'est pas le problème invoqué.

    En effet, il manque des parenthèses, mais pas seulement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <xsl:value-of select="count(./@marker-class-name='page-title'(position())=1" />
    Ton expression Xpath n'est pas structurée correctement. Voir le tutoriel sur XPath.

    Je fais un if pour être sur de prendre celui qui correspond à "page-title" (mais ça me semble obsolète puisque c'est celui que je sélectionne avec fo:marker[1]...)
    Fait un test, tu verra bien !

    Je vais me pencher sur "position()" pour essayer de comprendre son fonctionnement.
    Très bonne idée.

  5. #5
    Membre averti Avatar de titouille
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    353
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2005
    Messages : 353
    Points : 356
    Points
    356
    Par défaut
    Fait un test, tu verra bien !
    C'était déjà fait... je réitère, et le résultat est toujours le même... aucun changement entre ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    <xsl:template match="fo:marker[1]">
    	<xsl:if test="./@marker-class-name='page-title'">
    	<h2><xsl:value-of select="." /></h2>
    	</xsl:if>
    </xsl:template>
    et ça

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    <xsl:template match="fo:marker[1]">
    	<h2><xsl:value-of select="." /></h2>
    </xsl:template>

    Peut être que je n'ai pas compris ou tu voulais en venir, mais je ne vois aucune différence... et ça me semble logique, puisque je pointe sur le premier marqueur qui correspond forcément au class-name 'page-title'.

    Pour le reste, j'ai fait des tests avec xsl:for-each et là, position() fonctionne correctement. Seulement je n'utilise pas xsl:for-each mais des templates avec apply-templates... Donc soit il faut que je refonde un peu mon xsl pour que les blocs de premier niveau soient pris dans un for-each, soit je n'ai toujours pas ma solution... mais je m'entête, je finirai bien par comprendre ;-)


    PS :
    Ton expression Xpath n'est pas structurée correctement.
    C'est toi qui l'a écrite

  6. #6
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 563
    Points : 21 627
    Points
    21 627
    Par défaut
    En fait, 'faudrait que tu sois plus clair, à propos de ce qu'il faut faire et pas faire, avec ces fo:marker, là.

    Je suppose que ça se comprendrait mieux si je reprenais le FO, que je le transformais en PDF, et que j'essaie d'analyser pour voir ce que ça fait en PDF et ce que ça devrait faire en HTML... Mais bon, flemme, quoi.

  7. #7
    Membre averti Avatar de titouille
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    353
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2005
    Messages : 353
    Points : 356
    Points
    356
    Par défaut
    Salut thelvin,

    En fait le but n'est pas de reproduire exactement le pdf. Je veux juste récupérer les données et les afficher sous forme html, donc parser le fichier fo, transformer les fo:block / fo:block-container en div, les fo:inline en span, les fo:table en table, etc... Après, la mise en page ne demande pas d'être exactement la même.

    C'est juste pour éviter de devoir tout retaper à la main de A à Z le contenu statique du pdf. Mais j'ai à peu près réussi à faire ce que je voulais en modifiant un peu mon xsl. A la base, je partais avec :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    <xsl:template match="fo:root">
    <xsl:apply-templates />
    </xsl:template>
    Et j'ai modifié cette entrée pour faire des for-each au départ, qui me permettent premièrement de récupérer les fo:marker et de ne prendre que le premier (en travaillant avec position()). Je peux ensuite itérer sur le block (ou block-container) de début puis utiliser apply-templates pour la suite des évènements...

    Je suis à peu près arrivé à mon but. Mis à part quelques problèmes de mise en page que je finirai bien par régler, ma seule gène, c'est que j'ai maintenant des templates pour block et block-container, mais que j'ai du "dupliquer" leur contenu dans mon template de base fo:root pour que ça fonctionne correctement. Mais c'est un moindre mal.

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

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

    Informations forums :
    Inscription : Octobre 2009
    Messages : 1 460
    Points : 2 372
    Points
    2 372
    Par défaut
    ... il m'arrive clairement de me planter,
    ... mais rarement deux fois de suite :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <xsl:value-of select="count(./@marker-class-name='page-title'(position())=1" />

  9. #9
    Membre expérimenté
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    1 466
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 1 466
    Points : 1 610
    Points
    1 610
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <xsl:template match="fo:marker">
    	<xsl:if test="@marker-class-name='page-title' and not(preceding::fo:marker/@marker-class-name='page-title')">
    	<h1><xsl:value-of select="." /></h1>
    	</xsl:if>
    </xsl:template>

  10. #10
    Membre averti Avatar de titouille
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    353
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2005
    Messages : 353
    Points : 356
    Points
    356
    Par défaut
    Polymorphisme... Je me trompe ou tu as encore remis la même expression, qui a toujours 3 parenthèses ouvrantes et seulement 2 fermantes ? C'était pour le gag ?

    And the winner is... Morbo !

    Expression nickel. ça me permet de supprimer mon template de départ qui reprenait tout une partie des variables et déclarations pour fo:block et fo:block-container.

    Merci à tous !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [XSL] Transformation d'un tableau (fichier xml vers html)
    Par Bananou dans le forum XSL/XSLT/XPATH
    Réponses: 3
    Dernier message: 27/04/2010, 12h03
  2. [XSLT] probleme de copie de balise de XML vers HTML via XSL
    Par Clercq dans le forum XSL/XSLT/XPATH
    Réponses: 1
    Dernier message: 27/11/2006, 13h52
  3. [Débutante][XSL-FO]Flux XML vers HTML puis vers PDF
    Par norkius dans le forum XSL/XSLT/XPATH
    Réponses: 7
    Dernier message: 03/05/2006, 14h29
  4. Conversion WORD vers HTML V4
    Par elitost dans le forum Balisage (X)HTML et validation W3C
    Réponses: 4
    Dernier message: 13/09/2005, 16h24
  5. XML/XSL vers HTML: comment transformer les linefeed en <B
    Par AlainM dans le forum XSL/XSLT/XPATH
    Réponses: 5
    Dernier message: 18/11/2003, 12h30

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