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 :

[XSL] Comment ne pas réstituer un élément vide ?


Sujet :

XML/XSL et SOAP

  1. #1
    Candidat au Club
    Homme Profil pro
    Médiamaticien
    Inscrit en
    Janvier 2012
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Médiamaticien
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Janvier 2012
    Messages : 13
    Points : 4
    Points
    4
    Par défaut [XSL] Comment ne pas réstituer un élément vide ?
    Bonjour,

    Je suis débutant en XSL et je dois créer des feuilles de style pour transformer des documents XML en XML_EAD. Suite à de nombreuses recherches je n'ai rien trouvé alors je me lance .

    Je pars sur un modèle qui comporte tout les champs qu'il est possible d'avoir dans notre base de donnée:

    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
    <?xml version="1.0" encoding="utf-8"?>
    <!-- Cette feuille de style s'applique uniquement aux dossiers -->
     
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
     
    	<xsl:template match="Record" name="ShowRecDossier1">
     
    		<unitid>
    			<xsl:value-of select="DetailData/DataElement[@ElementId=2]/ElementValue/TextValue"/>
    		<lb />
    			<xsl:value-of select="DetailData/DataElement[@ElementId=18]/ElementValue/TextValue"/>
    		</unitid>
     
    		<unittitle>
    			<xsl:value-of select="DetailData/DataElement[@ElementId=1]/ElementValue/TextValue"/>
    		</unittitle>
     
    		<unitdate>
    			<xsl:attribute name="normal">
    				<xsl:value-of select="DetailData/DataElement[@ElementId=7]/ElementValue/DateRange/TextRepresentation"/>
    			</xsl:attribute>
    				<lb />
    			<xsl:value-of select="DetailData/DataElement[@ElementId=10068]/ElementValue/TextValue"/>
    		</unitdate>
     
    		<physdesc>
    			<physfacet type="Support"> 
    				<xsl:value-of select="DetailData/DataElement[@ElementId=10102]/ElementValue/TextValue"/>
    			</physfacet>			
    			<genreform type="Type de documents d'archives">
    				<xsl:value-of select="DetailData/DataElement[@ElementId=17]/ElementValue/TextValue"/>
    			</genreform>			
    			<extent>
    				<xsl:value-of select="DetailData/DataElement[@ElementId=10112]/ElementValue/TextValue"/>
    			</extent>
    			<dimensions type="hauteur x largeur" unit="centimètre"><xsl:value-of select="DetailData/DataElement[@ElementId=10054]/ElementValue/TextValue"/></dimensions>
    		</physdesc>
     
    		<physloc>	
    			<xsl:value-of select="DetailData/DataElement[@ElementId=10117]/ElementValue/TextValue"/>
    		</physloc>	
     
    	</xsl:template>
    </xsl:stylesheet>
    Et j'obtient le résultat suivant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    <unitid>CH AEV, 1 DM, 1  <lb/>
    </unitid>
    <unittitle>Législation, messages et rapports sur l'organisation militaire</unittitle>
    <unitdate normal="1802-1836">
    <lb/>
    </unitdate>
    <physdesc>
    <physfacet type="Support"/>
    <genreform type="Type de documents d'archives"/>
    <extent/>
    <dimensions type="hauteur x largeur" unit="centimètre"/>
    </physdesc>
    <physloc/>
    Il faudrait que j'obtienne le même résultat mais en supprimant les balises qui ne contiennent rien et remplacer les espace et les virgules de l'identifiant de l'unité documentaire (<unitid>). Comme ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <unitid>CH_AEV-1_DM-1</unitid>
    <unittitle>Législation, messages et rapports sur l'organisation militaire</unittitle>
    <unitdate normal="1802-1836"></unitdate>
    Comment puis-je le faire ? (Ou bien connaissez-vous des sites qui expliques cela que j'aurais malheureusement ratés durant ma recherche ?)


    Merci d'avance pour vos réponse,
    Renaud

  2. #2
    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
    Si t'as la possibilité de passer en XSL 2.0, tu peux facilement remplacer les virgules et espaces de ton unitid en utilisant la fonction replace(string,pattern,replace).
    Si tu dois rester en XSL 1.0, tu peux faire un template récursif pour faire le traitement avec des substring-before(string1,string2) et substring-after(string1,string2).

    Pour ce qui est de ne pas afficher les balises si le contenu est vide, tu n'as pas 36 possibilités : tu dois tester pour chaque balise si son contenu sera vide ou non avec des xsl:if.

  3. #3
    Candidat au Club
    Homme Profil pro
    Médiamaticien
    Inscrit en
    Janvier 2012
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Médiamaticien
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Janvier 2012
    Messages : 13
    Points : 4
    Points
    4
    Par défaut
    Citation Envoyé par Loceka Voir le message
    Si t'as la possibilité de passer en XSL 2.0, tu peux facilement remplacer les virgules et espaces de ton unitid en utilisant la fonction replace(string,pattern,replace).
    Si tu dois rester en XSL 1.0, tu peux faire un template récursif pour faire le traitement avec des substring-before(string1,string2) et substring-after(string1,string2).
    Hello, tout d'abord merci pour ta réponse.
    Pour te répondre oui je suis obliger de rester en XSL 1.0. Pourrais-tu m'indiquer ce qu'est un template récursif stp ? (Et oui je suis un débutant) Ou alors un lien ou je pourrais me renseigner car je nage là ...


    Citation Envoyé par Loceka Voir le message
    Pour ce qui est de ne pas afficher les balises si le contenu est vide, tu n'as pas 36 possibilités : tu dois tester pour chaque balise si son contenu sera vide ou non avec des xsl:if.
    Pour cela je suis arrivé à obtenir ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <unitid>CH AEV, 1 DM, 1<lb /></unitid>
    <unittitle>Législation, messages et rapports sur l'organisation militaire</unittitle>
    <unitdate normal="1802-1836">                <lb /></unitdate>
    Avec ce code-ci:
    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
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
     
    	<xsl:template match="Record" name="ShowRecDossier1">
     
     
     
    	<xsl:if test="//Record/DetailData/DataElement[@ElementId=2]/ElementValue/TextValue">
    		<unitid>
    			<xsl:if test="DetailData/DataElement[@ElementId=2]/ElementValue/TextValue"> 
    				<xsl:value-of select="DetailData/DataElement[@ElementId=2]/ElementValue/TextValue"/>
    			</xsl:if>
    		<lb />
    			<xsl:if test="DetailData/DataElement[@ElementId=18]/ElementValue/TextValue"> 
    				<xsl:value-of select="DetailData/DataElement[@ElementId=18]/ElementValue/TextValue"/>
    			</xsl:if>	
    		</unitid>
    	</xsl:if>		
     
    	<xsl:if test="DetailData/DataElement[@ElementId=1]/ElementValue/TextValue">
    		<unittitle>
    			<xsl:value-of select="DetailData/DataElement[@ElementId=1]/ElementValue/TextValue"/>
    		</unittitle>
    	</xsl:if>
     
    		<unitdate>
    			<xsl:attribute name="normal">
    				<xsl:value-of select="DetailData/DataElement[@ElementId=7]/ElementValue/DateRange/TextRepresentation"/>
    			</xsl:attribute>
    				<lb />
    			<xsl:value-of select="DetailData/DataElement[@ElementId=10068]/ElementValue/TextValue"/>
    		</unitdate>
     
    	<xsl:if test="DetailData/DataElement[@ElementId=10102]/ElementValue/TextValue">	
    		<xsl:if test="DetailData/DataElement[@ElementId=17]/ElementValue/TextValue">
    			<xsl:if test="DetailData/DataElement[@ElementId=10112]/ElementValue/TextValue">
    				<xsl:if test="DetailData/DataElement[@ElementId=10054]/ElementValue/TextValue">
    					<physdesc>
    						<xsl:if test="DetailData/DataElement[@ElementId=10102]/ElementValue/TextValue">
    							<physfacet type="Support"> 
    								<xsl:value-of select="DetailData/DataElement[@ElementId=10102]/ElementValue/TextValue"/>
    							</physfacet>
    						</xsl:if>
     
    						<xsl:if test="DetailData/DataElement[@ElementId=17]/ElementValue/TextValue">
    							<genreform type="Type de documents d'archives">
    								<xsl:value-of select="DetailData/DataElement[@ElementId=17]/ElementValue/TextValue"/>
    							</genreform>
    						</xsl:if>
     
    						<xsl:if test="DetailData/DataElement[@ElementId=10112]/ElementValue/TextValue">
    							<extent>
    								<xsl:value-of select="DetailData/DataElement[@ElementId=10112]/ElementValue/TextValue"/>
    							</extent>
    						</xsl:if>
     
    						<xsl:if test="DetailData/DataElement[@ElementId=10054]/ElementValue/TextValue">
    							<dimensions type="hauteur x largeur" unit="centimètre">
    								<xsl:value-of select="DetailData/DataElement[@ElementId=10054]/ElementValue/TextValue"/>
    							</dimensions>
    						</xsl:if>
    					</physdesc>
    				</xsl:if>
    			</xsl:if>
    		</xsl:if>
    	</xsl:if>	
     
    		<xsl:if test="DetailData/DataElement[@ElementId=10117]/ElementValue/TextValue">
    			<physloc>
    				<xsl:value-of select="DetailData/DataElement[@ElementId=10117]/ElementValue/TextValue"/>
    			</physloc>
    		</xsl:if>
     
     
    	</xsl:template>
    </xsl:stylesheet>
    Est-ce correcte ou juste un coup de chance que le résultat soit celui (presque) souhaité ?

    Merci,
    Renaud

  4. #4
    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
    Un template récursif est un template (utilisé comme une fonction) qui se rappelle lui-même jusqu'à ce que le traitement soit terminé.
    Ici par exemple, pour supprimer les virgules tu pourrais faire :
    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
    <xsl:template name="replace_comma">
    	<xsl:param name="from_string"/>
    	<xsl:param name="to_string" select="''"/>
     
    	<xsl:choose>
    		<xsl:when test="contains($from_string, ', ')">
    			<!-- cas où la chaîne restante contient ', ' -->
    			<xsl:call-template name="replace_comma">
    				<!-- la nouvelle chaîne restante est la partie après le ', ' -->
    				<xsl:with-param name="from_string" select="substring-after($from_string, ', ')"/>
    				<!-- la chaîne resultante est l'ancien résultat auquel on ajoute la partie d'avant le ', ' puis un '-' à la place -->
    				<xsl:with-param name="to_string" select="concat($to_string, substring-before($from_string, ', '), '-')"/>
    			</xsl:call-template>
    		</xsl:when>
    		<xsl:otherwise>
    			<!-- affichage du résultat -->
    			<xsl:value-of select="concat($to_string, $from_string)"/>
    		</xsl:otherwise>
    	</xsl:choose>
    </xsl:template>
    Pour l'appeller la première fois, il suffit d'écrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <xsl:call-template name="replace_comma">
    	<xsl:with-param name="from_string" select="DetailData/DataElement[@ElementId=2]/ElementValue/TextValue"/>
    </xsl:call-template>
    Pour remplacer les espaces et les virgules sans espaces derrière, tu peux utiliser la fonction translate. Il te suffit de mettre le résultat du call-template dans une variable (voir xsl:variable) puis d'appliquer la fonction translate sur cette variable : translate($string_wo_comma, ' ,', '_-').
    La fonction translate remplace chaque caractère du deuxième argument (ici « ' ,' ») par le caractère à la même position dans le troisième argument (ici « '_-' ») ou supprime le caractère s'il n'y a pas de caractère à la même position dans le 3ième argument.
    Dans le cas présent, elle remplace donc ' ' par '_' et ',' par '-'.

    Sinon pour ton code, le résultat est presque tel que souhaité parce que le code est presque bon.

    Voilà comment il faut écrire le test, pour chaque balise :
    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:if test="DetailData/DataElement[@ElementId=2]/ElementValue/TextValue|DetailData/DataElement[@ElementId=18]/ElementValue/TextValue">
    	<unitid>
    		<xsl:choose>
    			<xsl:when test="DetailData/DataElement[@ElementId=2]/ElementValue/TextValue">
    				<xsl:value-of select="DetailData/DataElement[@ElementId=2]/ElementValue/TextValue"/>
    				<xsl:if test="DetailData/DataElement[@ElementId=18]/ElementValue/TextValue">
    					<lb />
    					<xsl:value-of select="DetailData/DataElement[@ElementId=18]/ElementValue/TextValue"/>
    				</xsl:if>
    			</xsl:when>
    			<xsl:otherwise>
    				<xsl:if test="DetailData/DataElement[@ElementId=18]/ElementValue/TextValue">
    					<xsl:value-of select="DetailData/DataElement[@ElementId=18]/ElementValue/TextValue"/>
    				</xsl:if>
    			</xsl:otherwise>
    		</xsl:choose>
    	</unitid>
    </xsl:if>
    C'est très lourd mais je ne vois pas de façon de faire plus simplement (ce qui ne veut pas dire qu'il n'y en a pas).

  5. #5
    Candidat au Club
    Homme Profil pro
    Médiamaticien
    Inscrit en
    Janvier 2012
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Médiamaticien
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Janvier 2012
    Messages : 13
    Points : 4
    Points
    4
    Par défaut
    Merci pour cette réponse Je vais aller me chercher un bon café et essayer cela

  6. #6
    Candidat au Club
    Homme Profil pro
    Médiamaticien
    Inscrit en
    Janvier 2012
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Médiamaticien
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Janvier 2012
    Messages : 13
    Points : 4
    Points
    4
    Par défaut
    J'ai modifier ma feuille de style comme ceci:

    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
    <?xml version="1.0" encoding="utf-8"?>
    <!-- Cette feuille de style s'applique uniquement aux dossiers -->
     
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
     
    	<xsl:template match="Record" name="ShowRecDossier1">
     
    		<xsl:if test="DetailData/DataElement[@ElementId=2]/ElementValue/TextValue|DetailData/DataElement[@ElementId=18]/ElementValue/TextValue">
    			<unitid>
    				<xsl:choose>
    					<xsl:when test="DetailData/DataElement[@ElementId=2]/ElementValue/TextValue">
    					<xsl:value-of select="DetailData/DataElement[@ElementId=2]/ElementValue/TextValue"/>
    						<xsl:if test="DetailData/DataElement[@ElementId=18]/ElementValue/TextValue">
    							<lb />
    							<xsl:value-of select="DetailData/DataElement[@ElementId=18]/ElementValue/TextValue"/>
    						</xsl:if>
    					</xsl:when>
    					<xsl:otherwise>
    						<xsl:if test="DetailData/DataElement[@ElementId=18]/ElementValue/TextValue">
    							<xsl:value-of select="DetailData/DataElement[@ElementId=18]/ElementValue/TextValue"/>
    						</xsl:if>
    					</xsl:otherwise>
    				</xsl:choose>
    			</unitid>
    		</xsl:if>
     
    		<xsl:if test="DetailData/DataElement[@ElementId=1]/ElementValue/TextValue">
    			<unittitle>
    				<xsl:value-of select="DetailData/DataElement[@ElementId=1]/ElementValue/TextValue"/>
    			</unittitle>
    		</xsl:if>
     
    		<xsl:if test="DetailData/DataElement[@ElementId=7]/ElementValue/DateRange/TextRepresentation|DetailData/DataElement[@ElementId=10068]/ElementValue/TextValue">
    			<unitdate>
    				<xsl:choose>
    					<xsl:when test="DetailData/DataElement[@ElementId=7]/ElementValue/DateRange/TextRepresentation">
    					<xsl:attribute name="normal">
    						<xsl:value-of select="DetailData/DataElement[@ElementId=7]/ElementValue/DateRange/TextRepresentation"/>
    					</xsl:attribute>
    					<xsl:value-of select="DetailData/DataElement[@ElementId=7]/ElementValue/DateRange/TextRepresentation"/>	
    						<xsl:if test="DetailData/DataElement[@ElementId=10068]/ElementValue/TextValue">
    							<lb />
    							<xsl:value-of select="DetailData/DataElement[@ElementId=10068]/ElementValue/TextValue"/>
    						</xsl:if>
    					</xsl:when>
    					<xsl:otherwise>
    						<xsl:if test="DetailData/DataElement[@ElementId=10068]/ElementValue/TextValue">
    							<xsl:value-of select="DetailData/DataElement[@ElementId=10068]/ElementValue/TextValue"/>
    						</xsl:if>
    					</xsl:otherwise>
    				</xsl:choose>	
    			</unitdate>
    		</xsl:if>		
     
     
    		<xsl:if test="DetailData/DataElement[@ElementId=10102]/ElementValue/TextValue|DetailData/DataElement[@ElementId=17]/ElementValue/TextValue|DetailData/DataElement[@ElementId=10112]/ElementValue/TextValue|DetailData/DataElement[@ElementId=10054]/ElementValue/TextValue">
    			<physdesc>
    				<xsl:choose>
    				<xsl:when test="DetailData/DataElement[@ElementId=10102]/ElementValue/TextValue">
    					<physfacet type="Support"> 
    						<xsl:value-of select="DetailData/DataElement[@ElementId=10102]/ElementValue/TextValue"/>
    					</physfacet>
    						<xsl:if test="DetailData/DataElement[@ElementId=17]/ElementValue/TextValue">
    							<genreform type="Type de documents d'archives">
    								<xsl:value-of select="DetailData/DataElement[@ElementId=17]/ElementValue/TextValue"/>
    							</genreform>
    						</xsl:if>
    							<xsl:if test="DetailData/DataElement[@ElementId=10112]/ElementValue/TextValue">
    								<extent>
    									<xsl:value-of select="DetailData/DataElement[@ElementId=10112]/ElementValue/TextValue"/>
    								</extent>
    							</xsl:if>
    								<xsl:if test="DetailData/DataElement[@ElementId=10054]/ElementValue/TextValue">
    									<dimensions type="hauteur x largeur" unit="centimètre">
    										<xsl:value-of select="DetailData/DataElement[@ElementId=10054]/ElementValue/TextValue"/>
    									</dimensions>
    								</xsl:if>
    				</xsl:when>
    				<xsl:otherwise>
    					<xsl:if test="DetailData/DataElement[@ElementId=10054]/ElementValue/TextValue">
    						<xsl:value-of select="DetailData/DataElement[@ElementId=10054]/ElementValue/TextValue"/>
    					</xsl:if>
    				</xsl:otherwise>
    			</xsl:choose>				
    		</physdesc>
    		</xsl:if>
     
    		<xsl:if test="DetailData/DataElement[@ElementId=10117]/ElementValue/TextValue">
    			<physloc>
    				<xsl:value-of select="DetailData/DataElement[@ElementId=10117]/ElementValue/TextValue"/>
    			</physloc>
    		</xsl:if>
     
     
    	</xsl:template>
    </xsl:stylesheet>
    J'obtient d'orénavant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <unitid>CH AEV, 1 DM, 1</unitid>
    <unittitle>Législation, messages et rapports sur l'organisation militaire</unittitle>
    <unitdate normal="1802-1836">1802-1836</unitdate>
    Avant de me lancer sur le template récursif est-ce-que le passage cité ci-dessous est correcte ?
    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
    <xsl:if test="DetailData/DataElement[@ElementId=10102]/ElementValue/TextValue|DetailData/DataElement[@ElementId=17]/ElementValue/TextValue|DetailData/DataElement[@ElementId=10112]/ElementValue/TextValue|DetailData/DataElement[@ElementId=10054]/ElementValue/TextValue">
    			<physdesc>
    				<xsl:choose>
    				<xsl:when test="DetailData/DataElement[@ElementId=10102]/ElementValue/TextValue">
    					<physfacet type="Support"> 
    						<xsl:value-of select="DetailData/DataElement[@ElementId=10102]/ElementValue/TextValue"/>
    					</physfacet>
    						<xsl:if test="DetailData/DataElement[@ElementId=17]/ElementValue/TextValue">
    							<genreform type="Type de documents d'archives">
    								<xsl:value-of select="DetailData/DataElement[@ElementId=17]/ElementValue/TextValue"/>
    							</genreform>
    						</xsl:if>
    							<xsl:if test="DetailData/DataElement[@ElementId=10112]/ElementValue/TextValue">
    								<extent>
    									<xsl:value-of select="DetailData/DataElement[@ElementId=10112]/ElementValue/TextValue"/>
    								</extent>
    							</xsl:if>
    								<xsl:if test="DetailData/DataElement[@ElementId=10054]/ElementValue/TextValue">
    									<dimensions type="hauteur x largeur" unit="centimètre">
    										<xsl:value-of select="DetailData/DataElement[@ElementId=10054]/ElementValue/TextValue"/>
    									</dimensions>
    								</xsl:if>
    				</xsl:when>
    				<xsl:otherwise>
    					<xsl:if test="DetailData/DataElement[@ElementId=10054]/ElementValue/TextValue">
    						<xsl:value-of select="DetailData/DataElement[@ElementId=10054]/ElementValue/TextValue"/>
    					</xsl:if>
    				</xsl:otherwise>
    			</xsl:choose>				
    		</physdesc>
    		</xsl:if>
    Merci,
    Renaud

  7. #7
    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
    Citation Envoyé par Mister Ren Voir le message
    est-ce-que le passage cité ci-dessous est correcte ?
    A priori non.

    Là tu n'affiches aucune sous-balise si l'élément "DetailData/DataElement[@ElementId=10102]/ElementValue/TextValue" n'est pas trouvé. Pourtant les autres balises n'en dépendent pas. Ceci dit c'est peut-être le résultat désiré.

    De plus, côté indentation, tous les ifs étant au même "niveau" il serait plus logique, correct et lisible de les indenter de la même façon.

  8. #8
    Candidat au Club
    Homme Profil pro
    Médiamaticien
    Inscrit en
    Janvier 2012
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Médiamaticien
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Janvier 2012
    Messages : 13
    Points : 4
    Points
    4
    Par défaut
    Citation Envoyé par Loceka Voir le message
    A priori non.

    Là tu n'affiches aucune sous-balise si l'élément "DetailData/DataElement[@ElementId=10102]/ElementValue/TextValue" n'est pas trouvé. Pourtant les autres balises n'en dépendent pas. Ceci dit c'est peut-être le résultat désiré.
    Effectivement cela n'est pas correcte car je dois quand même afficher les sous-balise si l'élément "DetailData/DataElement[@ElementId=10102]/ElementValue/TextValue" n'est pas trouvé.


    Citation Envoyé par Loceka Voir le message
    De plus, côté indentation, tous les ifs étant au même "niveau" il serait plus logique, correct et lisible de les indenter de la même façon.
    D'accord je modifie cela pour que se sois correct et je vais tenter de regarder pour la sélection des sous-balises.

    Merci pour ces informations.

  9. #9
    Candidat au Club
    Homme Profil pro
    Médiamaticien
    Inscrit en
    Janvier 2012
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Médiamaticien
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Janvier 2012
    Messages : 13
    Points : 4
    Points
    4
    Par défaut
    Hello,

    Maintenant que je n'ai presque plus de champs vide il faudrait que je sache comment faire avec des champs qui comporte plus de 2 informations.
    Exemple:
    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
     
    <physdesc> 
    	<physfacet type="Support">
    		<xsl:value-of select="DetailData/DataElement[@ElementId=10102]/ElementValue/TextValue"/>
    	</physfacet>
    	<physfacet type="Etat de conservation">
    		<xsl:value-of select="DetailData/DataElement[@ElementId=10018]/ElementValue/TextValue"/>
    	</physfacet>
    	<genreform type="Type de documents d'archives">
    		<xsl:value-of select="DetailData/DataElement[@ElementId=17]/ElementValue/TextValue"/>
    	</genreform>
    	<genreform type="Sceau">
    		<xsl:value-of select="DetailData/DataElement[@ElementId=10066]/ElementValue/TextValue"/>
    	</genreform>
    	<extent>
    		<xsl:value-of select="DetailData/DataElement[@ElementId=10112]/ElementValue/TextValue"/>
    	</extent>
    	<dimensions>
    		<xsl:value-of select="DetailData/DataElement[@ElementId=10054]/ElementValue/TextValue"/>
    	</dimensions>
    	<persname role="Rédacteur">
    		<xsl:value-of select="DetailData/DataElement[@ElementId=10101]/ElementValue/TextValue"/>
    	</persname>
    	<persname role="Signature">
    		<xsl:value-of select="DetailData/DataElement[@ElementId=10065]/ElementValue/TextValue"/>
    	</persname>
    	<persname role="Témoins">
    		<xsl:value-of select="DetailData/DataElement[@ElementId=10100]/ElementValue/TextValue"/>
    	</persname>
    	<genreform><xsl:value-of select="DetailData/DataElement[@ElementId=10137]/ElementValue/TextValue"/></genreform>
    </physdesc>
    Est-ce la balise <xsl:when> que je dois répéter ou la balise <xsl:otherwise> ?

    Merci d'avance,
    Renaud

  10. #10
    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
    C'est la balise when car c'est seulement dans celle-là que tu peux mettre une condition.
    La balise otherwise n'intervient que quand toutes les conditions des when sont fausses.

  11. #11
    Candidat au Club
    Homme Profil pro
    Médiamaticien
    Inscrit en
    Janvier 2012
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Médiamaticien
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Janvier 2012
    Messages : 13
    Points : 4
    Points
    4
    Par défaut
    D'accord merci pour ta réponse.
    Ce serait donc comme ceci ? (Sauf l'alignement des balises qui se décale quand je colle le code):

    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
    <xsl:if test="DetailData/DataElement[@ElementId=10102]/ElementValue/TextValue|DetailData/DataElement[@ElementId=17]/ElementValue/TextValue|DetailData/DataElement[@ElementId=10112]/ElementValue/TextValue|DetailData/DataElement[@ElementId=10054]/ElementValue/TextValue">
    			<physdesc>
    				<xsl:choose>
    				<xsl:when test="DetailData/DataElement[@ElementId=10102]/ElementValue/TextValue">
    					<physfacet type="Support"> 
    						<xsl:value-of select="DetailData/DataElement[@ElementId=10102]/ElementValue/TextValue"/>
    					</physfacet>
    						<xsl:if test="DetailData/DataElement[@ElementId=17]/ElementValue/TextValue">
    							<genreform type="Type de documents d'archives">
    								<xsl:value-of select="DetailData/DataElement[@ElementId=17]/ElementValue/TextValue"/>
    							</genreform>
    						</xsl:if>
    						<xsl:if test="DetailData/DataElement[@ElementId=10112]/ElementValue/TextValue">
    							<extent>
    								<xsl:value-of select="DetailData/DataElement[@ElementId=10112]/ElementValue/TextValue"/>
    							</extent>
    						</xsl:if>
    						<xsl:if test="DetailData/DataElement[@ElementId=10054]/ElementValue/TextValue">
    							<dimensions type="hauteur x largeur" unit="centimètre">
    								<xsl:value-of select="DetailData/DataElement[@ElementId=10054]/ElementValue/TextValue"/>
    							</dimensions>
    						</xsl:if>
    				</xsl:when>
    				<xsl:when test="DetailData/DataElement[@ElementId=17]/ElementValue/TextValue">
    					<genreform type="Type de documents d'archives">
    						<xsl:value-of select="DetailData/DataElement[@ElementId=17]/ElementValue/TextValue"/>
    					</genreform>
    						<xsl:if test="DetailData/DataElement[@ElementId=10112]/ElementValue/TextValue">
    							<extent>
    								<xsl:value-of select="DetailData/DataElement[@ElementId=10112]/ElementValue/TextValue"/>
    							</extent>
    						</xsl:if>
    						<xsl:if test="DetailData/DataElement[@ElementId=10054]/ElementValue/TextValue">
    							<dimensions type="hauteur x largeur" unit="centimètre">
    								<xsl:value-of select="DetailData/DataElement[@ElementId=10054]/ElementValue/TextValue"/>
    							</dimensions>
    						</xsl:if>
    				</xsl:when>
    				<xsl:when test="DetailData/DataElement[@ElementId=17]/ElementValue/TextValue">
    					<extent>
    						<xsl:value-of select="DetailData/DataElement[@ElementId=10112]/ElementValue/TextValue"/>
    					</extent>
    						<xsl:if test="DetailData/DataElement[@ElementId=10054]/ElementValue/TextValue">
    							<dimensions type="hauteur x largeur" unit="centimètre">
    								<xsl:value-of select="DetailData/DataElement[@ElementId=10054]/ElementValue/TextValue"/>
    							</dimensions>
    						</xsl:if>
    				</xsl:when>
    				<xsl:otherwise>
    					<xsl:if test="DetailData/DataElement[@ElementId=10054]/ElementValue/TextValue">
    						<dimensions type="hauteur x largeur" unit="centimètre">
    							<xsl:value-of select="DetailData/DataElement[@ElementId=10054]/ElementValue/TextValue"/>
    						</dimensions>
    					</xsl:if>
    				</xsl:otherwise>
    				</xsl:choose>				
    			</physdesc>
    		</xsl:if>

  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
    Tu peux faire comme ça mais le plus simple dans ton cas serait de ne mettre que des ifs :
    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
    <xsl:if test="DetailData/DataElement[@ElementId=10102]/ElementValue/TextValue|DetailData/DataElement[@ElementId=17]/ElementValue/TextValue|DetailData/DataElement[@ElementId=10112]/ElementValue/TextValue|DetailData/DataElement[@ElementId=10054]/ElementValue/TextValue">
    	<physdesc>
    		<xsl:if test="DetailData/DataElement[@ElementId=10102]/ElementValue/TextValue">
    			<physfacet type="Support"> 
    				<xsl:value-of select="DetailData/DataElement[@ElementId=10102]/ElementValue/TextValue"/>
    			</physfacet>
    		</xsl:if>
    		<xsl:if test="DetailData/DataElement[@ElementId=17]/ElementValue/TextValue">
    			<genreform type="Type de documents d'archives">
    				<xsl:value-of select="DetailData/DataElement[@ElementId=17]/ElementValue/TextValue"/>
    			</genreform>
    		</xsl:if>
    		<xsl:if test="DetailData/DataElement[@ElementId=10112]/ElementValue/TextValue">
    			<extent>
    				<xsl:value-of select="DetailData/DataElement[@ElementId=10112]/ElementValue/TextValue"/>
    			</extent>
    		</xsl:if>
    		<xsl:if test="DetailData/DataElement[@ElementId=10054]/ElementValue/TextValue">
    			<dimensions type="hauteur x largeur" unit="centimètre">
    				<xsl:value-of select="DetailData/DataElement[@ElementId=10054]/ElementValue/TextValue"/>
    			</dimensions>
    		</xsl:if>
    	</physdesc>
    </xsl:if>
    Ca fait (je crois) exactement la même chose mais c'est beaucoup plus lisible et maintenable (sans redondance).

  13. #13
    Candidat au Club
    Homme Profil pro
    Médiamaticien
    Inscrit en
    Janvier 2012
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Médiamaticien
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Janvier 2012
    Messages : 13
    Points : 4
    Points
    4
    Par défaut
    Ok je vais essayer cela.

    Merci de prendre ce temps pour m'aider en tout cas

  14. #14
    Candidat au Club
    Homme Profil pro
    Médiamaticien
    Inscrit en
    Janvier 2012
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Médiamaticien
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Janvier 2012
    Messages : 13
    Points : 4
    Points
    4
    Par défaut
    Hello,

    J'ai effectuer les modifications pour obtenir finalement ceci:

    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
    <c03 level="otherlevel" otherlevel="Dossier">
                <did>
                  <unitid>CH AEV-1 DM-1</unitid>
                  <unittitle>Législation, messages et rapports sur l'organisation militaire</unittitle>
                  <unitdate normal="1802/1836">1802-1836</unitdate>
                </did>
                <accessrestrict>
                  <p altrender="TermOfProtection">Fin de période</p>
                  <p altrender="ProtectionEndDate">1836-12-31</p>
                </accessrestrict>
                <userestrict>
                  <p altrender="Permission">Aucune</p>
                  <p altrender="PhysicalUsability">Sans restriction</p>
                  <p altrender="Accessability">Publique</p>
                  <p altrender="UsageNote"></p>
                </userestrict>
    Il ne reste plus qu'une seul balise vide qui s'affiche !

    Pour ce qui est de retirer les espace et les virgules dans la balise <unitid> j'en suis là:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <unitid>CH AEV-1 DM-1</unitid>
    Serait-il possible d'ajouter un remplacement des espaces directement dans le template que tu m'avais présenter (replace_comma) ou dois-je passer par plusieurs autres étapes ?

    Merci,
    Renaud

  15. #15
    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
    Citation Envoyé par Mister Ren Voir le message
    Il ne reste plus qu'une seul balise vide qui s'affiche !
    A priori il doit rester une erreur dans ton code.

    Citation Envoyé par Mister Ren Voir le message
    Serait-il possible d'ajouter un remplacement des espaces directement dans le template que tu m'avais présenter (replace_comma) ou dois-je passer par plusieurs autres étapes ?
    Tu pourrais le faire lors que tu as terminé le traitement, donc lors du dernier concat :
    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
    <xsl:template name="replace_comma">
    	<xsl:param name="from_string"/>
    	<xsl:param name="to_string" select="''"/>
     
    	<xsl:choose>
    		<xsl:when test="contains($from_string, ', ')">
    			<!-- cas où la chaîne restante contient ', ' -->
    			<xsl:call-template name="replace_comma">
    				<!-- la nouvelle chaîne restante est la partie après le ', ' -->
    				<xsl:with-param name="from_string" select="substring-after($from_string, ', ')"/>
    				<!-- la chaîne resultante est l'ancien résultat auquel on ajoute la partie d'avant le ', ' puis un '-' à la place -->
    				<xsl:with-param name="to_string" select="concat($to_string, substring-before($from_string, ', '), '-')"/>
    			</xsl:call-template>
    		</xsl:when>
    		<xsl:otherwise>
    			<!-- affichage du résultat -->
    			<xsl:value-of select="translate(concat($to_string, $from_string), ' ,', '_-')"/>
    		</xsl:otherwise>
    	</xsl:choose>
    </xsl:template>

  16. #16
    Candidat au Club
    Homme Profil pro
    Médiamaticien
    Inscrit en
    Janvier 2012
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Médiamaticien
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Janvier 2012
    Messages : 13
    Points : 4
    Points
    4
    Par défaut
    Merci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <unitid>CH_AEV-1_DM-2</unitid>

    Je vais donc maintenant m'atteler à la dernière balise qui s'affiche lorsqu'elle est vide ( je pense que c'est une erreur dans le chemin d'accès). Je te fais signe dès que j'ai fait cela.

  17. #17
    Candidat au Club
    Homme Profil pro
    Médiamaticien
    Inscrit en
    Janvier 2012
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Médiamaticien
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Janvier 2012
    Messages : 13
    Points : 4
    Points
    4
    Par défaut
    Hello,

    Alors pour ce qui est de la balise qui s'affiche toujours même lorsque elle est vide c'est bon, l'outil de publication n'affiche pas l'information lorsque elle est vide donc c'est ok.

    Je suis maintenant tombé sur un autre problème:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     <unitid>CH_AEV-Fonderie_d'Ardon</unitid>
    Puis-je introduire le " ' " dans le template récursif pour le remplacer par un " - " car dès que je tente de le faire il me créer un nouvel argument ?

    Après j’arrête

    Merci d'avance,
    Renaud

  18. #18
    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
    Il suffit de le rajouter au translate, je te laisse trouver comment (avec la doc que je t'ai fourni tu devrais trouver).

  19. #19
    Candidat au Club
    Homme Profil pro
    Médiamaticien
    Inscrit en
    Janvier 2012
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Médiamaticien
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Janvier 2012
    Messages : 13
    Points : 4
    Points
    4
    Par défaut
    Hello,

    J'ai regardé la doc que tu m'as mise pour faire cette correction mais à chaque fois que j'insère le " ' " j’obtiens l'erreur :

    Error Transforming XML
    Jeton ')' attendu, '_--' trouvé. ..._string, $from_string), ' ',', ' -->_--<-- ')
    A n'importe quel endroit que je l'insère l'erreur là apparaît.

    J'essaye encore de faire cela.

    Merci,
    Renaud

  20. #20
    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
    C'est dû au fait que les guillemets sont aussi utilisé en temps que délimitateur de chaîne.

    Pour passer outre, il faut :
    - utiliser l'entité correspondant au guillement (&#39
    - inverser les " et les ' pour que l'entité ne soit pas encadrée par des '.

    Voilà donc ce qu'il faut écrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <xsl:value-of select='translate(concat($to_string, $from_string), "' ,", "-_-")'/>

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Comment ne pas afficher un champs vide dans un template
    Par altair8080 dans le forum AngularJS
    Réponses: 3
    Dernier message: 18/05/2015, 21h33
  2. [xml + xsl] détection d'élément vide
    Par tut dans le forum XSL/XSLT/XPATH
    Réponses: 20
    Dernier message: 11/05/2007, 10h44
  3. comment savoir si un dossier est vide ou pas?
    Par Amissan dans le forum Entrée/Sortie
    Réponses: 3
    Dernier message: 16/02/2007, 13h31
  4. Réponses: 1
    Dernier message: 08/11/2005, 14h40
  5. [XSL]Comment faire ceci ?? Mon for-each n'affiche pas tout !
    Par Devil666 dans le forum XSL/XSLT/XPATH
    Réponses: 4
    Dernier message: 27/07/2005, 15h04

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