IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

XSL/XSLT/XPATH XML Discussion :

utilisation des templates pour traiter une partie d'un doc tei


Sujet :

XSL/XSLT/XPATH XML

  1. #1
    Membre éclairé Avatar de tigunn
    Homme Profil pro
    Développeur de bug
    Inscrit en
    Janvier 2003
    Messages
    608
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations professionnelles :
    Activité : Développeur de bug

    Informations forums :
    Inscription : Janvier 2003
    Messages : 608
    Points : 658
    Points
    658
    Par défaut utilisation des templates pour traiter une partie d'un doc tei
    Bonjour,
    Je dois récupérer le contenu d'une balise tei (Text encoding initiative = édition numérique de documents).
    Voici un 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
    <record>
        <doc_id>cote-g226_1_f_176__r____</doc_id>
        <nb_termes>3</nb_termes>
        <num_fragment>1</num_fragment>
        <bibl3>b6839-3</bibl3>
        <termes>
            <term rend="underline">gens de <choice>
                    <abbr>lettr</abbr>
                    <expan>lettr<ex>es</ex>
                    </expan>
                </choice>
            </term>
            <term>Beautés</term>
            <term hand="GF-encre" rend="underline">Socrate <choice>
                    <orig>
                        <c>&amp;</c>
                    </orig>
                    <reg>et</reg>
                </choice> Platon</term>
        </termes>
    </record>
    Je veux retourner tous les termes, avec, quant c'est le cas, leur version originale et régularisée.
    Dans l'exemple, il y a 3 termes dont 2 qui auront 2 forme (orig et reg + abbr et expan); je dois donc retourner 5 termes.
    Pour le premier <term> : "gens de lettr" et "gens de lettres";
    pour le 2nd : "Beautés" (tout simple, mon préféré)
    pour le 3ème: "Socrate & Platon" et "Socrate et Platon".

    Pour cela, j'utilise XSLT:
    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
    <?xml version="1.0" encoding="UTF-8"?>
    <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    	xmlns:xi="http://www.w3.org/2001/XInclude" xmlns:svg="http://www.w3.org/2000/svg"
    	xmlns:math="http://www.w3.org/1998/Math/MathML" xmlns="http://www.tei-c.org/ns/1.0"
    	xmlns:dbp="http://site.fr/ns/1.0" version="1.0">
     
    	<xsl:template match="/">
    		<xsl:for-each select="//termes/*">
    		REGUL : INSERT INTO tmp_termes_indexation VALUES ('<xsl:call-template name="regul"></xsl:call-template>');
    		DIPLO : INSERT INTO tmp_termes_indexation VALUES ('<xsl:call-template name="diplo"></xsl:call-template>');
     
    		</xsl:for-each>
    	</xsl:template>
     
    	<xsl:template match="*[ancestor::termes]">
    		<xsl:apply-templates />
    	</xsl:template>
     
    	<xsl:template match="record">
    	</xsl:template>
     
    	<xsl:template match="bibl3"></xsl:template>
     
    	<xsl:template match="//termes"></xsl:template>
     
    	<xsl:template name="regul" match="//term/choice">
    		<xsl:choose>
    			<xsl:when test="abbr[@type='conventionnel']">
    				<xsl:choose>
    					<xsl:when test="reg">
    						<xsl:apply-templates select="reg[last()]" />
    					</xsl:when>
    					<xsl:otherwise>
    						<xsl:apply-templates select="abbr" />
    					</xsl:otherwise>
    				</xsl:choose>
    			</xsl:when>
    			<xsl:when test="abbr and expan and reg">
    				<xsl:apply-templates select="reg" />
    			</xsl:when>
    			<xsl:when test="abbr and expan">
    				<xsl:apply-templates select="expan" />
    			</xsl:when>
    			<xsl:when test="orig and reg">
    				<xsl:apply-templates select="reg" />
    			</xsl:when>
    			<xsl:when test="sic and corr">
    				<xsl:apply-templates select="corr" />
    			</xsl:when>
    			<xsl:otherwise>
    				<xsl:apply-templates />
    			</xsl:otherwise>
    		</xsl:choose>
    	</xsl:template>    
     
       <xsl:template name="diplo" match="//term/choice">        
            <xsl:choose>            
                <xsl:when test="abbr">                
                  <xsl:apply-templates select="abbr"/>                                         
                </xsl:when>               
                <xsl:when test="orig">
                    <xsl:apply-templates select="orig"/>               
                </xsl:when>                  
                <xsl:when test="sic">
                    <xsl:apply-templates select="sic"/>               
                </xsl:when>             
                <xsl:otherwise>
                 <xsl:apply-templates/>
                </xsl:otherwise>            
            </xsl:choose>        
        </xsl:template>
     
    	<xsl:template match="lb">*</xsl:template>
    </xsl:stylesheet>
    Sauf que le template "regul" semble être ignoré; je ne sais comment faire pour récupérer toutes mes formes pour ces termes.

  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 843
    Points
    4 843
    Par défaut
    Ce sont tes "match" qui se téléscopent :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <xsl:template name="regul" match="//term/choice">
    <!-- ... -->
    <xsl:template name="diplo" match="//term/choice">
    Si tu veux faire 2 templates qui matchent le même élément, il faut spécifier un mode (cf http://w3schools.com/xsl/el_template.asp) et que tu les appelles avec ce mode (cf http://w3schools.com/xsl/el_apply-templates.asp).

    Aussi, il est totalement inutile de mettre "//un_element" dans un match. Je ne sais pas du tout ce que ça fait, mais je sais que ça ne fait pas ce que tu veux.

    Il suffit de mettre match="ton_element" pour que ça fonctionne.

Discussions similaires

  1. Approche pour traiter une partie d'un flux
    Par gokudomatic dans le forum Développement de jobs
    Réponses: 1
    Dernier message: 30/08/2013, 13h48
  2. [RegEx] Sprintf / utilisation des espaces pour remplir une ligne
    Par exilquery dans le forum Langage
    Réponses: 4
    Dernier message: 07/10/2012, 17h46
  3. Utilisation des pourcentages pour structurer une page
    Par Jean Sympa dans le forum Mise en page CSS
    Réponses: 5
    Dernier message: 20/12/2010, 12h04
  4. [Python] Est-ce une bonne idée d'utiliser des modules pour stocker des objets ?
    Par Neolander dans le forum Développement 2D, 3D et Jeux
    Réponses: 1
    Dernier message: 05/04/2008, 14h45
  5. [VBA] Utilisation des gets pour une classe de classe
    Par EvaristeGaloisBis dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 15/07/2007, 21h30

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