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]<b> et </b> dans des blocs if différents ?


Sujet :

XSL/XSLT/XPATH XML

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    56
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2005
    Messages : 56
    Par défaut [XSL]<b> et </b> dans des blocs if différents ?
    Bonjour,

    J'avoue que je cale sur ce point . je travaille sur un xsl qui doit tranformer un xml en html. J'aimerais pouvoir utiliser des tag de formatage html dans différents bloc. En gros, je voudrais arriver à pouvoir faire ceci :

    ...
    <xsl:if test="$isBold=1">
    <b>
    <xsl:if>
    ...
    <xsl:value-of select=".">
    ...
    <xsl:if test="$isBold=1">
    </b>
    <xsl:if>

    le problème étant que l'xsl n'est pas valable car il s'attends à trouver un </b> consécutif à l'ouverture du tag.

    J'ai essayé d'escapé les caractères avec &lt;b&gt; mais dans ce cas là, les caractère sont aussi escapé dans le le fichier html et du coup, mon texte n'est pas formaté, pareil avec un cdata m^^eme si je n'avais pas beaucoup d'espoir

    Est-il possible de faire ce que je veux ?

    J'ai déjà une solution de remplacement mais pouvoir faire ceci me permettrait de rendre le code nettement plus lisible sans ça, je suis partit pour des série de <xsl:when> à n'en plus finir

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    56
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2005
    Messages : 56
    Par défaut
    J'ai finalement réussit à mettre au point un système pour éviter les choose à rallonge, je le poste ici au cas il y aurait des gens intéressés mais je laisse ouvert, le système décrit au dessus serait quand même plus performant.

    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
     
    <xsl:template name="textParsing">
    <xsl:param name="textToOutput"/>
    <xsl:param name="attributes"/>
    	<xsl:if test="$attributes[name()='bold']">
    		<b>
    			<xsl:call-template name="textParsing">
    				<xsl:with-param name="textToOutput" select="$textToOutput"/>
    				<xsl:with-param name="attributes" select="$attributes[name () != 'bold']"/>
    			</xsl:call-template>							
    		</b>
    	</xsl:if>
    	<xsl:if test="$attributes[name()='italic']">
    		<i>
    			<xsl:call-template name="textParsing">
    				<xsl:with-param name="textToOutput" select="$textToOutput"/>
    				<xsl:with-param name="attributes" select="$attributes[name () != 'italic']"/>
    			</xsl:call-template>							
    		</i>
    	</xsl:if>	
    	<xsl:if test="$attributes[name()='underline']">
    		<u>
    			<xsl:call-template name="textParsing">
    				<xsl:with-param name="textToOutput" select="$textToOutput"/>
    				<xsl:with-param name="attributes" select="$attributes[name () != 'u']"/>
    			</xsl:call-template>							
    		</u>
    	</xsl:if>	
    	<xsl:if test="$attributes[name()='base-line']">
    		<xsl:choose>
    			<xsl:when test="$attributes[name()='base-line']='SUPER'">
    				<super>
    					<xsl:call-template name="textParsing">
    						<xsl:with-param name="textToOutput" select="$textToOutput"/>
    						<xsl:with-param name="attributes" select="$attributes[name () != 'base-line']"/>
    					</xsl:call-template>							
    				</super>			
    			</xsl:when>
    			<xsl:when test="$attributes[name()='base-line']='SUB'">
    				<sub>
    					<xsl:call-template name="textParsing">
    						<xsl:with-param name="textToOutput" select="$textToOutput"/>
    						<xsl:with-param name="attributes" select="$attributes[name () != 'base-line']"/>
    					</xsl:call-template>							
    				</sub>						
    			</xsl:when>
    		</xsl:choose>
    	</xsl:if>
     
    	<xsl:if test="not($attributes[name() = 'bold']) and not($attributes[name() ='italic']) and not($attributes[name()='underline']) and not($attributes[name()='base-line'])">
    		<xsl:value-of select="$textToOutput"/>
    	</xsl:if>
     
     
     
    </xsl:template>

  3. #3
    Expert confirmé
    Avatar de GrandFather
    Inscrit en
    Mai 2004
    Messages
    4 587
    Détails du profil
    Informations personnelles :
    Âge : 55

    Informations forums :
    Inscription : Mai 2004
    Messages : 4 587
    Par défaut
    Bonjour,

    ce problème de balises disjointes est assez récurrent, il est généralement révélateur d'une approche trop « classique » du problème, au sens de ce que l'on fairait si l'on utilisait un langage de développement autre que XSLT, et pas assez « XSLTienne ».

    En l'occurrence, ton code est trop complexe et procédural, tu devrais pouvoir t'en tirer avec quelques templates bien choisis. Pour être plus précis, il faudrait qu'on puisse un peu examiner ta source XML.
    FAQ XML
    ------------
    « Le moyen le plus sûr de cacher aux autres les limites de son savoir est de ne jamais les dépasser »
    Giacomo Leopardi

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    56
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2005
    Messages : 56
    Par défaut
    Effectivement, je me rends bien compte que c'est du à mon approche, il m'arrive souvent de me dire : Tiens, je vais faire ça comme ça et au fil de mes essais, je me rends compte que ce n'est pas la bonne approche mais vu que je ne fais de l'xslt qu'une fois tout les lunes, c'est pas vraiment facile de "switcher"

    A noter que le code ci dessus fonctionne mais si il y a moyen de l'optimiser, je suis preneur !

    voila un exemple d'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
     
    <document>
                 <block class-id="*00">
    ...
                 </block>
    .....
    	<block class-id="*32">
    				<text line-feed="true" bold="true">Forme pharmaceutique: </text>
    				<text line-feed="true">Gélules et comprimés pelliculés.</text>
    				<text italic="true">Glivec 100 mg: </text>
    				<text line-feed="false">Poudre blanche à jaune dans une gélule opaque orange à</text>
    				<text line-feed="true">gris orangé, portant l'inscription "NVR SI".</text>
    				<text italic="true">Glivec 400 mg:</text>
    				<text line-feed="false"> Comprimé pelliculé jaune très foncé à brun orangé,</text>
    				<text line-feed="false">ovaloïde, biconvexe, à bords biseautés, portant l'inscription "NVR" gravée</text>
    				<text line-feed="true">sur une face et "SL" sur l'autre.</text>
    			</block>
    et voila l'élément l'xsd pour l'élément text pour être tout à fait complet

    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
     
    	<xs:element name="text" nillable="false">
    		<xs:complexType>
    			<xs:simpleContent>
    				<xs:extension base="xs:string">
    					<xs:attribute name="size" use="optional" default="3">
    						<xs:simpleType>
    							<xs:restriction base="xs:int">
    								<xs:pattern value="[1-7]"/>
    							</xs:restriction>
    						</xs:simpleType>
    					</xs:attribute>
    					<xs:attribute name="line-feed" type="xs:boolean" use="optional" default="false"/>
    					<xs:attribute name="italic" type="xs:boolean" use="optional" default="false"/>
    					<xs:attribute name="bold" type="xs:boolean" use="optional" default="false"/>
    					<xs:attribute name="underline" type="xs:boolean" use="optional" default="false"/>
    					<xs:attribute name="base-line" use="optional">
    						<xs:simpleType>
    							<xs:restriction base="xs:NMTOKEN">
    								<xs:enumeration value="SUPER"/>
    								<xs:enumeration value="SUB"/>
    							</xs:restriction>
    						</xs:simpleType>
    					</xs:attribute>
    					<xs:attribute name="position.value" type="xs:int" use="optional"/>
    					<xs:attribute name="position.type" use="optional">
    						<xs:simpleType>
    							<xs:restriction base="xs:NMTOKEN">
    								<xs:enumeration value="RIGHT"/>
    								<xs:enumeration value="CENTER"/>
    								<xs:enumeration value="LEFT"/>
    							</xs:restriction>
    						</xs:simpleType>
    					</xs:attribute>
    					<xs:attribute name="position.measure-unit" use="optional">
    						<xs:simpleType>
    							<xs:restriction base="xs:NMTOKEN">
    								<xs:enumeration value="TWIPS"/>
    								<xs:enumeration value="INCH"/>
    								<xs:enumeration value="MILLIMETER"/>
    							</xs:restriction>
    						</xs:simpleType>
    					</xs:attribute>
    					<xs:attribute name="symbol-family" use="optional">
    						<xs:simpleType>
    							<xs:restriction base="xs:NMTOKEN">
    								<xs:enumeration value="SYMBOL"/>
    								<xs:enumeration value="WINGDINGS"/>
    								<xs:enumeration value="BODY_TEXT"/>
    							</xs:restriction>
    						</xs:simpleType>
    					</xs:attribute>
    					<xs:attribute name="symbol-value" type="xs:string" use="optional"/>
    				</xs:extension>
    			</xs:simpleContent>
    		</xs:complexType>
    	</xs:element>
    A noter que les attributs line-feed ainsi que ceux relatifs à la position sont traité en amonts, je n'ai que les attributs de formatage à parser dans ce template.

  5. #5
    Expert confirmé
    Avatar de GrandFather
    Inscrit en
    Mai 2004
    Messages
    4 587
    Détails du profil
    Informations personnelles :
    Âge : 55

    Informations forums :
    Inscription : Mai 2004
    Messages : 4 587
    Par défaut
    Il doit y avoir des données que je n'ai pas et qui expliqueraient l'usage de templates nommés au lieu de simples templates, mais je persiste à trouver ton code un peu trop compliqué par rapport à la tâche... Tu peux poster le rendu HTML que tu attends du block donné en exemple ?
    FAQ XML
    ------------
    « Le moyen le plus sûr de cacher aux autres les limites de son savoir est de ne jamais les dépasser »
    Giacomo Leopardi

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    56
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2005
    Messages : 56
    Par défaut
    Le rendu est classique. J'utilise des templates nommés à cause d'un problème dans le fichier source (sur lequel je n'ai pas le controle ) . Le position.value se répète sur plusieurs éléments <text> alors qu'il ne devrait se trouver que sur le premier élément. Du coup, je dois traîter le fichier "ligne html" par "ligne html". Je ne peux donc pas faire un simple for-each.

    les sources qui posent problème :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    	<block class-id="*01">
    		<text position.value="2664" position.type="LEFT" position.measure-unit="TWIPS">1-ALPHA LEO capsules 1 </text>
    		<text position.value="2664" position.type="LEFT" position.measure-unit="TWIPS" symbol-family="BODY_TEXT" symbol-value="03BC"/>
    		<text line-feed="true" position.value="2664" position.type="LEFT" position.measure-unit="TWIPS">g</text>
    		<text position.value="2664" position.type="LEFT" position.measure-unit="TWIPS">1-ALPHA LEO gouttes 2 </text>
    		<text position.value="2664" position.type="LEFT" position.measure-unit="TWIPS" symbol-family="BODY_TEXT" symbol-value="03BC"/>
    		<text line-feed="true" position.value="2664" position.type="LEFT" position.measure-unit="TWIPS">g/ml</text>
    		<text position.value="2664" position.type="LEFT" position.measure-unit="TWIPS">1-ALPHA LEO I.V. 1 </text>
    		<text position.value="2664" position.type="LEFT" position.measure-unit="TWIPS" symbol-family="BODY_TEXT" symbol-value="03BC"/>
    		<text line-feed="true" position.value="2664" position.type="LEFT" position.measure-unit="TWIPS">g</text>
    	</block>

    Par conséquent, mon contexte reste sur l'élément block en cours de traitement et j'utilise une fonction récursive pour traiter ses enfants un à un avec un paramètre qui est incrémenté à chaque appel, ce qui explique que j'utilise des tempaltes nommés plutôt qu'un simple match.

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. XSL et CSS - insérer un style CSS directement dans du XSL
    Par KrisTiano dans le forum XML/XSL et SOAP
    Réponses: 3
    Dernier message: 04/07/2008, 09h58
  3. Réponses: 1
    Dernier message: 26/03/2008, 14h44
  4. [XSL] Passer une variable a une balise HTML dans un fichier
    Par poseidon2 dans le forum XSL/XSLT/XPATH
    Réponses: 1
    Dernier message: 09/03/2006, 16h39
  5. [XSL] Tester si la valeur est un entier dans un xml
    Par MrMaze dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 23/07/2003, 04h35

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