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 pour la compilation de phrases citant une chaine


Sujet :

XML/XSL et SOAP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 27
    Par défaut xsl pour la compilation de phrases citant une chaine
    Bonjour,
    je souhaite disposer d'un fichier xsl permettant d'afficher l'ensemble des occurrences d'une même chaine dans un document interventions.xml ;

    je dois récupérer la chaine comme variable,
    lancer la recherche dans l'ensemble des paragraphes du document,
    vérifier l'existence de ladite chaine,
    lorsque le terme 'astuce' se trouve dans le dit paragraphe, je souhaite afficher les 200 caractères qui précèdent et les deux cents qui suivent.

    Mon script est tout a fait déficient, mais je ne sais plus par ou commencer.
    Quelqu'un pourrait-il m'aider ? Merci d'avance,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    <?xml version="1.0" encoding="UTF-8"?>
       <xsl:param name='lemme'/>
          <xsl:template match="p">
           <xsl:for-each select="p[contains(partie, $lemme)] ">
              <xsl:value-of select="p"/>
              <xsl:value-of select="substring($lemme, 1,-250)"/>
           </xsl:for-each>
    </xsl:template>	
    </xsl:stylesheet>

  2. #2
    Membre Expert Avatar de alain.couthures
    Profil pro
    Gérant
    Inscrit en
    Avril 2007
    Messages
    902
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Gérant

    Informations forums :
    Inscription : Avril 2007
    Messages : 902
    Par défaut
    Tout d'abord, une transformation commence généralement par un template explicite sur la racine du document. Dans votre situation ce pourrait être ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <xsl:template match="/">
      <xsl:apply-templates select="//p"/>
    </xsl:template>
    Pourriez-vous joindre un exemple du XML source ?

    Quel sens associez-vous à une longueur négative pour l'appel à la fonction XPath substring (je ne suis pas sûr que cela soit supporté par tous les outils...) ?

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 27
    Par défaut
    bonjour et merci pour votre réponse,
    Voici mon document interventions.xml
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    <?xml version='1.0' encoding='ISO-8859-1' standalone='yes'?>
    <?xml-stylesheet TYPE='text/css' HREF='site.css' ?>
    <TeiCorpus.2>
    <auteur>
    <nom>Ciceron</nom>
    <TEI.2 id="1">
    <titre>Premier discours</titre>
    <partie id="1" nom="prologue">
    <p>sunt, explicabo. Nemo enim ipsam voluptatem, quia voluptas sit, aspernatur aut odit aut fugit, sed quia consequuntur magni dolores eos, qui ratione voluptatem sequi nesciunt, neque porro quisquam est, qui dolorem ipsum, quia dolor sit, amet, consectetur, adipisci velit, sed quia non numquam eius modi tempora incidunt, ut labore et dolore magnam aliquam quaerat voluptatem. Ut enim ad minima veniam, quis nostrum exercitationem ullam corporis suscipit laboriosam, nisi ut aliquid ex ea commodi consequatur? Quis autem vel </p>
    </partie>
    </TEI.2>
    </auteur>
    </TeiCorpus.2>
    Voici le fichier xsl apres correctif :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    <?xml version="1.0" encoding="UTF-8"?>
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
       <xsl:output method="html" version="1.0" encoding="UTF-8" indent="yes"/>
       <xsl:param name='lemme'/>
       <xsl:template match="/">
          <xsl:apply-templates select="//p"/>
           <xsl:for-each select="p[contains(p, $lemme)] ">
                      <xsl:value-of select="substring(habeo, 1,-250)"/>
           </xsl:for-each>
    </xsl:template>	
    </xsl:stylesheet>
    Dans le fichier xml, la chaine 'enim' apparait deux fois dans l'élément <p>. Je voudrais obtenir le résultat suivant :
    sunt, explicabo. Nemo enim ipsam voluptatem, quia voluptas sit, aspernatur aut odit aut fugit,
    ut labore et dolore magnam aliquam quaerat voluptatem. Ut enim ad minima veniam, quis nostrum exercitationem ullam corporis suscipit laboriosam

    Je ne sais pas voir mon erreur dans le fichier xsl.
    Merci pour votre aide

  4. #4
    Membre Expert Avatar de alain.couthures
    Profil pro
    Gérant
    Inscrit en
    Avril 2007
    Messages
    902
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Gérant

    Informations forums :
    Inscription : Avril 2007
    Messages : 902
    Par défaut
    C'est plus clair avec l'exemple !

    Essayez donc déjà quelque chose 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
    <xsl:template match="/">
      <xsl:for-each select="//p[contains(., $lemme)] ">
        <xsl:variable name="sbefore" select="substring-before(., $lemme)"/>
        <p>
        <xsl:choose>
          <xsl:when test="string-length($sbefore) &lt; 200">
            <xsl:value-of select="$sbefore"/>
          </xsl:when>
          <xsl:otherwise>
            <xsl:value-of select="substring($sbefore, string-length($sbefore)-199, 200)"/>
          </xsl:otherwise>
        </xsl:choose>
        <span class="red"><xsl:value-of select="$lemme"/></span>
        <xsl:value-of select="substring(substring-after(., $lemme), 1, 200)"/>
        </p>
      </xsl:for-each>
    </xsl:template>
    Ca doit marcher (pas testé...) si le lemme n'apparait qu'une fois... Si le terme apparaît plusieurs fois, c'est un peu plus compliqué car il faut s'appuyer sur un template nommé récursif !

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 27
    Par défaut
    Merci pour votre message Alain.
    J'ai eu beau reprendre les fichiers php et xsl je ne parviens pas à faire appliquer la variable $lemme au processeur xslt. Soit j'obtiens la liste de tout les paragraphes, soit rien du tout. Mon fichier php pourtant semble correct :
    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
     
    $lemme=$_GET['lemme'];
    $tab = array(
    	'xml' => 'interventions.xml',
    	'xsl' => 'AfficheListeOccurrences.xsl',
    	'param1' => $lemme);
    if(is_array($tab))
    	if(!empty($tab['xml']) && !empty($tab['xsl']))
    	{
    		$DomXml = DOMDocument::load($tab['xml']) or die('');
    		$DomXsl = DOMDocument::load($tab['xsl']) or die('');
    		$process = new XSLTProcessor;
    		$process->importStyleSheet($DomXsl);
    		foreach($tab as $param => $value)
    			if($param === 'xml' || $param === 'xsl')
    				continue;
    			else
    				$process->setParameter('', $param, htmlspecialchars($value));
     
    		print $process->transformToXML($DomXml);
    	}
    Je remercie d'avance celui qui m'indiquera l'origine de mon erreur.
    De plus j'ai changé mon hébergement d'une page perso club internet à LWS et j'ai désormais ce message d'erreur :
    Fatal error: Cannot instantiate non-existent class: xsltprocessor in D:\www...
    Dois-je réaliser une manip particulière ? Le support n'évoque nulle part la question,
    merci à tous

  6. #6
    Membre Expert Avatar de alain.couthures
    Profil pro
    Gérant
    Inscrit en
    Avril 2007
    Messages
    902
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Gérant

    Informations forums :
    Inscription : Avril 2007
    Messages : 902
    Par défaut
    Avez-vous vérifié avec un phpinfo la version de PHP active pour votre hébergement ?

    C'est aussi le moyen de s'assurer que les traitements XSLT sont bien configurés et autorisés...

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 20
    Dernier message: 19/09/2012, 15h56
  2. Réponses: 13
    Dernier message: 31/03/2008, 09h14
  3. programme pour rechercher un codon stop sur une chaine d'adn sous perl
    Par thierry7106 dans le forum Bioinformatique
    Réponses: 4
    Dernier message: 13/04/2007, 01h02
  4. XSL FO:transformation d'un nombre en une chaine de caractere
    Par atoila dans le forum XSL/XSLT/XPATH
    Réponses: 6
    Dernier message: 06/06/2006, 16h43
  5. fct pour lire autant de caracteres dans une chaine?
    Par jeanfrancois dans le forum Langage
    Réponses: 3
    Dernier message: 30/03/2006, 15h45

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