Précédent   Forum des professionnels en informatique > Autres langages > XML/XSL et SOAP
XML/XSL et SOAP Forum d'entraide sur XML et SOAP. Avant de poster -> FAQ XML, Sources XML
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 18/01/2012, 12h26   #1
Invité de passage
 
Homme Renaud
Médiamaticien
Inscription : janvier 2012
Messages : 13
Détails du profil
Informations personnelles :
Nom : Homme Renaud
Localisation : Suisse

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

Informations forums :
Inscription : janvier 2012
Messages : 13
Points : 2
Points : 2
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 :
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 :
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 :
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
Mister Ren est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/01/2012, 14h41   #2
Membre Expert
 
Avatar de Loceka
 
Tlouye Ci
Inscription : mars 2004
Messages : 1 456
Détails du profil
Informations personnelles :
Nom : Tlouye Ci

Informations forums :
Inscription : mars 2004
Messages : 1 456
Points : 2 159
Points : 2 159
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.
Loceka est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/01/2012, 09h57   #3
Invité de passage
 
Homme Renaud
Médiamaticien
Inscription : janvier 2012
Messages : 13
Détails du profil
Informations personnelles :
Nom : Homme Renaud
Localisation : Suisse

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

Informations forums :
Inscription : janvier 2012
Messages : 13
Points : 2
Points : 2
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 :
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 :
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
Mister Ren est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/01/2012, 11h22   #4
Membre Expert
 
Avatar de Loceka
 
Tlouye Ci
Inscription : mars 2004
Messages : 1 456
Détails du profil
Informations personnelles :
Nom : Tlouye Ci

Informations forums :
Inscription : mars 2004
Messages : 1 456
Points : 2 159
Points : 2 159
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 :
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 :
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 :
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).
Loceka est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 20/01/2012, 11h26   #5
Invité de passage
 
Homme Renaud
Médiamaticien
Inscription : janvier 2012
Messages : 13
Détails du profil
Informations personnelles :
Nom : Homme Renaud
Localisation : Suisse

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

Informations forums :
Inscription : janvier 2012
Messages : 13
Points : 2
Points : 2
Merci pour cette réponse Je vais aller me chercher un bon café et essayer cela
Mister Ren est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/01/2012, 13h48   #6
Invité de passage
 
Homme Renaud
Médiamaticien
Inscription : janvier 2012
Messages : 13
Détails du profil
Informations personnelles :
Nom : Homme Renaud
Localisation : Suisse

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

Informations forums :
Inscription : janvier 2012
Messages : 13
Points : 2
Points : 2
J'ai modifier ma feuille de style comme ceci:

Code :
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 :
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 :
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
Mister Ren est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/01/2012, 14h10   #7
Membre Expert
 
Avatar de Loceka
 
Tlouye Ci
Inscription : mars 2004
Messages : 1 456
Détails du profil
Informations personnelles :
Nom : Tlouye Ci

Informations forums :
Inscription : mars 2004
Messages : 1 456
Points : 2 159
Points : 2 159
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.
Loceka est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/01/2012, 14h42   #8
Invité de passage
 
Homme Renaud
Médiamaticien
Inscription : janvier 2012
Messages : 13
Détails du profil
Informations personnelles :
Nom : Homme Renaud
Localisation : Suisse

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

Informations forums :
Inscription : janvier 2012
Messages : 13
Points : 2
Points : 2
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.
Mister Ren est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/01/2012, 14h19   #9
Invité de passage
 
Homme Renaud
Médiamaticien
Inscription : janvier 2012
Messages : 13
Détails du profil
Informations personnelles :
Nom : Homme Renaud
Localisation : Suisse

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

Informations forums :
Inscription : janvier 2012
Messages : 13
Points : 2
Points : 2
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 :
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
Mister Ren est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/01/2012, 16h37   #10
Membre Expert
 
Avatar de Loceka
 
Tlouye Ci
Inscription : mars 2004
Messages : 1 456
Détails du profil
Informations personnelles :
Nom : Tlouye Ci

Informations forums :
Inscription : mars 2004
Messages : 1 456
Points : 2 159
Points : 2 159
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.
Loceka est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 27/01/2012, 16h59   #11
Invité de passage
 
Homme Renaud
Médiamaticien
Inscription : janvier 2012
Messages : 13
Détails du profil
Informations personnelles :
Nom : Homme Renaud
Localisation : Suisse

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

Informations forums :
Inscription : janvier 2012
Messages : 13
Points : 2
Points : 2
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 :
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>
Mister Ren est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/01/2012, 17h15   #12
Membre Expert
 
Avatar de Loceka
 
Tlouye Ci
Inscription : mars 2004
Messages : 1 456
Détails du profil
Informations personnelles :
Nom : Tlouye Ci

Informations forums :
Inscription : mars 2004
Messages : 1 456
Points : 2 159
Points : 2 159
Tu peux faire comme ça mais le plus simple dans ton cas serait de ne mettre que des ifs :
Code :
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).
Loceka est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 27/01/2012, 17h19   #13
Invité de passage
 
Homme Renaud
Médiamaticien
Inscription : janvier 2012
Messages : 13
Détails du profil
Informations personnelles :
Nom : Homme Renaud
Localisation : Suisse

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

Informations forums :
Inscription : janvier 2012
Messages : 13
Points : 2
Points : 2
Ok je vais essayer cela.

Merci de prendre ce temps pour m'aider en tout cas
Mister Ren est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/02/2012, 08h14   #14
Invité de passage
 
Homme Renaud
Médiamaticien
Inscription : janvier 2012
Messages : 13
Détails du profil
Informations personnelles :
Nom : Homme Renaud
Localisation : Suisse

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

Informations forums :
Inscription : janvier 2012
Messages : 13
Points : 2
Points : 2
Hello,

J'ai effectuer les modifications pour obtenir finalement ceci:

Code :
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 :
<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
Mister Ren est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/02/2012, 08h37   #15
Membre Expert
 
Avatar de Loceka
 
Tlouye Ci
Inscription : mars 2004
Messages : 1 456
Détails du profil
Informations personnelles :
Nom : Tlouye Ci

Informations forums :
Inscription : mars 2004
Messages : 1 456
Points : 2 159
Points : 2 159
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 :
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>
Loceka est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 10/02/2012, 09h22   #16
Invité de passage
 
Homme Renaud
Médiamaticien
Inscription : janvier 2012
Messages : 13
Détails du profil
Informations personnelles :
Nom : Homme Renaud
Localisation : Suisse

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

Informations forums :
Inscription : janvier 2012
Messages : 13
Points : 2
Points : 2
Merci
Code :
<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.
Mister Ren est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/02/2012, 08h39   #17
Invité de passage
 
Homme Renaud
Médiamaticien
Inscription : janvier 2012
Messages : 13
Détails du profil
Informations personnelles :
Nom : Homme Renaud
Localisation : Suisse

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

Informations forums :
Inscription : janvier 2012
Messages : 13
Points : 2
Points : 2
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 :
 <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
Mister Ren est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/02/2012, 09h30   #18
Membre Expert
 
Avatar de Loceka
 
Tlouye Ci
Inscription : mars 2004
Messages : 1 456
Détails du profil
Informations personnelles :
Nom : Tlouye Ci

Informations forums :
Inscription : mars 2004
Messages : 1 456
Points : 2 159
Points : 2 159
Il suffit de le rajouter au translate, je te laisse trouver comment (avec la doc que je t'ai fourni tu devrais trouver).
Loceka est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/02/2012, 13h16   #19
Invité de passage
 
Homme Renaud
Médiamaticien
Inscription : janvier 2012
Messages : 13
Détails du profil
Informations personnelles :
Nom : Homme Renaud
Localisation : Suisse

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

Informations forums :
Inscription : janvier 2012
Messages : 13
Points : 2
Points : 2
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 :

Citation:
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
Mister Ren est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/02/2012, 14h37   #20
Membre Expert
 
Avatar de Loceka
 
Tlouye Ci
Inscription : mars 2004
Messages : 1 456
Détails du profil
Informations personnelles :
Nom : Tlouye Ci

Informations forums :
Inscription : mars 2004
Messages : 1 456
Points : 2 159
Points : 2 159
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 (')
- inverser les " et les ' pour que l'entité ne soit pas encadrée par des '.

Voilà donc ce qu'il faut écrire :
Code :
<xsl:value-of select='translate(concat($to_string, $from_string), "&#39; ,", "-_-")'/>
Loceka est déconnecté   Envoyer un message privé Réponse avec citation 20
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 06h41.


 
 
 
 
Partenaires

Hébergement Web