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 :

Aide XSLT Concaténer des données


Sujet :

XML/XSL et SOAP

  1. #1
    Nouveau Candidat au Club
    Aide XSLT Concaténer des données
    Bonjour à tous,

    Je débute avec le langage XSLT, et je m'arrache les cheveux depuis une semaine pour résoudre un problème.
    Je cherche à créer une nouvelle balise de forme <unitid type=cote>Ms. 1611 (1476)</unitid>, à partir de deux balises de forme <unitid type="numéro_de_notice">1611</unitid><unitid type="cote_indéterminée_a">1476</unitid>.
    Ces balises sont contenues dans une balise <did> qui contient d'autres balises qui ne doivent pas faire l'objet de la modification.
    Les autres balises <unitid type="division"> ne doivent pas êtres modifiées non plus.

    Ci-joint, un fragment de mon fichier XML:
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    <c id="D45051771" level="otherlevel" otherlevel="notice">
    				<did>
    					<unitid type="numéro_de_notice">1611</unitid>
    					<unitid type="cote_indéterminée_a">1476</unitid>
    					<unittitle>G. Vassel, Poésies provençales</unittitle>
    					<unitdate calendar="gregorian" era="ce" normal="1901/2000">XX<emph render="super">e</emph> siècle</unitdate>
    					<langmaterial>
    						<language langcode="oci">provençal</language>
    					</langmaterial>
    					<physdesc>
    						<physfacet type="support">Papier</physfacet>
    						<extent>87 feuillets</extent>
    						<dimensions unit="mm">240 × 185 mm</dimensions>
    						<physfacet type="reliure">Reliure maroquin, aux armes de la ville d'Aix</physfacet>
    					</physdesc>
    				</did>
    				<note type="provenance">
    					<p>Don de l'auteur, 1911.</p>
    				</note>
    				<controlaccess>
    					<persname>Vassel (G.)</persname>
    					<name>Poésies provençales</name>
    				</controlaccess>
    				<controlaccess>
    					<geogname>Aix-en-Provence</geogname>
    					<name>Reliure aux armes de la ville</name>
    				</controlaccess><c id="D45051772" level="otherlevel" otherlevel="sous-notice">
    					<did>
    						<unitid type="division">Fol. 2</unitid>
    						<unittitle>« Obro dóu jouglar Gustàvi Vassèu ; » avec photographies, dessins et autographes</unittitle>
    					</did>
    				</c>
    			</c><c id="D45051773" level="otherlevel" otherlevel="notice">
    				<did>
    					<unitid type="numéro_de_notice">1612</unitid>
    					<unitid type="cote_indéterminée_a">1477</unitid>
    					<unittitle>Statuts de l'Ordre du Croissant, placé sous le patronage de saint Maurice et créé par le roi René</unittitle>
    					<unitdate calendar="gregorian" era="ce" normal="1401/1500">XV<emph render="super">e</emph> siècle</unitdate>
    					<langmaterial>
    						<language langcode="fre">français</language>
    					</langmaterial>
    					<physdesc>
    						<physfacet type="support">Parchemin</physfacet>
    						<extent>19 feuillets</extent>
    						<dimensions unit="mm">240 × 170 mm</dimensions>
    						<physfacet type="reliure">Reliure moderne parchemin, avec armes sur les plats : <emph render="italic">d'or, à la croix bourdonnée de gueules, au chef d'azur, chargé d'une étoile du champ.</emph>
    						</physfacet>
    					</physdesc>
    				</did>
    				<scopecontent>
    					<p>Incomplet du premier feuillet : « ... ne au soupper... » — Fin (fol. 19 v<emph render="super">o</emph>) : « ... Donné ou conseil de l'Ordre, tenu à Angiers, le V<emph render="super">e</emph> jour d'aoust. » — Cf. Lecoy de la Marche, <emph render="italic">Le roi René</emph> (Paris, Didot, 1875, in-8<emph render="super">o</emph>), t. I, page 531, note 1.</p>
    				</scopecontent>
    				<note type="provenance">
    					<p>Achat, 1907.</p>
    				</note>
    				<controlaccess>
    					<corpname>Croissant (Ordre du)</corpname>
    					<name>Statuts</name>
    				</controlaccess>
    			</c>


    J'aimerai donc obtenir quelque chose qui ressemble à ça:

    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
    <c id="D45051771" level="otherlevel" otherlevel="notice">
    				<did>
    					<unitid type="cote">Ms. 1611 (1476)</unitid>
    					<unittitle>G. Vassel, Poésies provençales</unittitle>
    					<unitdate calendar="gregorian" era="ce" normal="1901/2000">XX<emph render="super">e</emph> siècle</unitdate>
    					<langmaterial>
    						<language langcode="oci">provençal</language>
    					</langmaterial>
    					<physdesc>
    						<physfacet type="support">Papier</physfacet>
    						<extent>87 feuillets</extent>
    						<dimensions unit="mm">240 × 185 mm</dimensions>
    						<physfacet type="reliure">Reliure maroquin, aux armes de la ville d'Aix</physfacet>
    					</physdesc>
    				</did>
    				<note type="provenance">
    					<p>Don de l'auteur, 1911.</p>
    				</note>
    				<controlaccess>
    					<persname>Vassel (G.)</persname>
    					<name>Poésies provençales</name>
    				</controlaccess>
    				<controlaccess>
    					<geogname>Aix-en-Provence</geogname>
    					<name>Reliure aux armes de la ville</name>
    				</controlaccess><c id="D45051772" level="otherlevel" otherlevel="sous-notice">
    					<did>
    						<unitid type="division">Fol. 2</unitid>
    						<unittitle>« Obro dóu jouglar Gustàvi Vassèu ; » avec photographies, dessins et autographes</unittitle>
    					</did>
    				</c>
    			</c><c id="D45051773" level="otherlevel" otherlevel="notice">
    				<did>
    					<unitid type="cote">Ms. 1612 (1477)</unitid>
    					<unittitle>Statuts de l'Ordre du Croissant, placé sous le patronage de saint Maurice et créé par le roi René</unittitle>
    					<unitdate calendar="gregorian" era="ce" normal="1401/1500">XV<emph render="super">e</emph> siècle</unitdate>
    					<langmaterial>
    						<language langcode="fre">français</language>
    					</langmaterial>
    					<physdesc>
    						<physfacet type="support">Parchemin</physfacet>
    						<extent>19 feuillets</extent>
    						<dimensions unit="mm">240 × 170 mm</dimensions>
    						<physfacet type="reliure">Reliure moderne parchemin, avec armes sur les plats : <emph render="italic">d'or, à la croix bourdonnée de gueules, au chef d'azur, chargé d'une étoile du champ.</emph>
    						</physfacet>
    					</physdesc>
    				</did>
    				<scopecontent>
    					<p>Incomplet du premier feuillet : « ... ne au soupper... » — Fin (fol. 19 v<emph render="super">o</emph>) : « ... Donné ou conseil de l'Ordre, tenu à Angiers, le V<emph render="super">e</emph> jour d'aoust. » — Cf. Lecoy de la Marche, <emph render="italic">Le roi René</emph> (Paris, Didot, 1875, in-8<emph render="super">o</emph>), t. I, page 531, note 1.</p>
    				</scopecontent>
    				<note type="provenance">
    					<p>Achat, 1907.</p>
    				</note>
    				<controlaccess>
    					<corpname>Croissant (Ordre du)</corpname>
    					<name>Statuts</name>
    				</controlaccess>
    			</c>


    Je pense être sur une première piste grâce à la feuille de style suivante, mais qui me supprime toutes les balises contenues dans <did>, et modifie aussi les <unitid type="division">

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    <xsl:stylesheet xmlns<img src="images/smilies/icon_mad.gif" border="0" alt="" title=":x" class="inlineimg" />sl="http://www.w3.org/1999/XSL/Transform"
        xmlns<img src="images/smilies/icon_mad.gif" border="0" alt="" title=":x" class="inlineimg" />s="http://www.w3.org/2001/XMLSchema"
        exclude-result-prefixes="xs"
        version="2.0">
        <xsl:template match="//did">
            <unitid type="cote">
                <xsl:value-of select="concat('Ms. ',unitid[@type='numéro_de_notice'],' (',unitid[@type='cote_indéterminée_a'],')')"/>
            </unitid>
        </xsl:template>
    </xsl:stylesheet>


    Est-ce qu'il existe un autre moyen que de récupérer toutes les balises de <did> perdues en faisant des <xsl:value-of select=""> dans le <xsl:template>?
    Quelle expression XPATH utiliser dans le <xsl:template match=""> pour que seules les balises <unitid> soient remplacées?
    Je pensais que le <xsl:variable> allait m'aider mais je n'ai pas su l'utiliser comme il faut...

    Un grand merci pour votre aide et vos réponses!

    Bon week-end

  2. #2
    Membre émérite
    On peut concevoir deux templates spécifiques pour ces deux éléments unitid et puis le reste on laisse la transformation identique ou ce que on a déjà à s'en occuper.
    Code xslt2 :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    <xsl:template match="unitid[parent::*/name()='did' and @type='numéro_de_notice']">
        <xsl:element name="unitid">
            <xsl:attribute name="type">
                <xsl:value-of select="'cote'" />
            </xsl:attribute>
            <xsl:value-of select="concat('Ms. ',./text(),' (',../unitid[@type='cote_indéterminée_a']/text(),')')" />
        </xsl:element>
    </xsl:template>
    <xsl:template match="unitid[parent::*/name()='did' and @type='cote_indéterminée_a']" />

  3. #3
    Nouveau Candidat au Club
    Un grand merci pour ce script!

    Il faut encore que je regarde du coté des fonctions "text()" et "name()" etc. que je ne sais pas encore utiliser correctement visiblement

    Encore merci,

    Bonne journée

###raw>template_hook.ano_emploi###