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 :

XSLT l'appel à ma fonction personnelle provoque une 'Erreur de segmentation'


Sujet :

XSL/XSLT/XPATH XML

  1. #1
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 550
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 550
    Points : 19 383
    Points
    19 383
    Par défaut XSLT l'appel à ma fonction personnelle provoque une 'Erreur de segmentation'
    Bonjour,

    j'utilise Xalan-c pour transformer la sortie XML de nmap -sn -PR -X - 192.168.1.0/24 avec cette feuille de style XSLT, constituée de ce que j'ai trouvé sur le net (#laCréature ), parce que je ne pratique pas XSL tous les jours.
    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
    <?xml version="1.1"?>
     
    <xsl:stylesheet version="2.0"
        xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
        xmlns:foo="http://example.com/foo">
     
        <xsl:output method="text" encoding="utf-8"/>
     
        <xsl:variable name="spaces" select="'                                            '" />
     
    <xsl:function name="foo:Fonc">
        <xsl:param name="prm" />
        <xsl:value-of select="substring( concat($prm, $spaces), 1 , 18)"/>
    </xsl:function>
     
        <xsl:template match="nmaprun">
            <xsl:apply-templates select="host">
                <xsl:sort select="concat(address/@addrtype,address/@addr)" order="ascending" />
            </xsl:apply-templates>
        </xsl:template>
     
        <xsl:template match="host">
            <xsl:value-of select="foo:Fonc(hostnames/hostname/@name)"/>
    <!--ça, "ça marche"        <xsl:value-of select="substring( concat(hostnames/hostname/@name, $spaces), 1 , 18)"/>-->
        </xsl:template>
     
    </xsl:stylesheet>
    sans l'appel à la fonction, le code fonctionne.
    avec cet appel, la sortie est Erreur de segmentation (core dumped).

    sauriez-vous me montrer et/ou m'expliquer mon erreur ?
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  2. #2
    Membre émérite Avatar de tsuji
    Inscrit en
    Octobre 2011
    Messages
    1 558
    Détails du profil
    Informations forums :
    Inscription : Octobre 2011
    Messages : 1 558
    Points : 2 736
    Points
    2 736
    Par défaut
    Je pense que la version de distribution de xalan-c le plus à jour n'est que 1.11 et qu'elle ne supporte que xslt1. La construction xsl:function exige le support de xslt2. C'est probablement pour ça qu'il ne fonctionne pas, pas encore.

    La documentation
    https://xalan.apache.org/xalan-c/index.html
    dit que
    The next major release of Xalan-C/C++ will hopefully be compatible with following standards. This added support will require a major version change from 1 to 2.

    XSL Transformations (XSLT) Version 2.0
    XSLT 2.0 and XQuery 1.0 Serialization
    XML Path Language (XPath) Version 2.0 (Second Edition)
    XQuery 1.0 and XPath 2.0 Formal Semantics (Second Edition)
    XQuery 1.0 and XPath 2.0 Data Model (XDM) (Second Edition)
    XQuery 1.0 and XPath 2.0 Functions and Operators (Second Edition)
    mais c'est une espérance seulement pour le moment pour v1.11.

    On peut le faire fonctionner avec saxon version graduite. Il n'y a pas trop de choix pour s'en sortir pour le moment, c'est vrai.

  3. #3
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 550
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 550
    Points : 19 383
    Points
    19 383
    Par défaut

    j'avais un espoir, car en passant la feuille de style en version 2.0, la seule déclaration de la fonction ne causait plus d'erreur.
    c'est bien dommage. tant pis.

    merci.
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  4. #4
    Membre émérite Avatar de tsuji
    Inscrit en
    Octobre 2011
    Messages
    1 558
    Détails du profil
    Informations forums :
    Inscription : Octobre 2011
    Messages : 1 558
    Points : 2 736
    Points
    2 736
    Par défaut
    Le support de l'écriture syntactique xsl:function n'est pas un enrichissement critique de xslt2 par rapport à xslt1 quoi que très utile. Les enrichissements se trouvent ailleurs.

    En xslt1 on peut tout à fait faire ce genre de fonctionalité si on trouve qu'on doit faire appeler à un morseau de script très fréquent. On utilise un template dit nommé. On peut même garder la construction foo:Fonc avec un namespace préfixé foo. Il suffit de réécrire cette partie de script de xsl:function comme ça.
    Code xslt1 ou xslt2 : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    <xsl:template name="foo:Fonc">
        <xsl:param name="prm" />
        <!-- profitons les valeurs par défaut pour plus de flexibilité -->
        <xsl:param name="startpos" select="1" />
        <xsl:param name="stoppos" select="18" />
        <xsl:value-of select="substring(concat($prm, $spaces), $startpos, $stoppos)" />
    </xsl:template>
    Et puis, on le fait appeler comme ça.
    Code xslt1 ou xslt2 : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    <xsl:template match="host">
        <!--
        <xsl:value-of select="foo:Fonc(hostnames/hostname/@name)"/>
        -->
        <xsl:call-template name="foo:Fonc">
            <xsl:with-param name="prm" select="hostnames/hostname/@name" />
        </xsl:call-template>
    </xsl:template>
    Voilà.

  5. #5
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 550
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 550
    Points : 19 383
    Points
    19 383
    Par défaut
    c'est très intéressant, et l'explication est très claire, je te remercie.

    maintenant, il faut que j'arbitre ente le nombre de lignes du template nommé (la "fonction"), et son appel.

    je fais quelques tests, et je reviendrai mettre en résolu.
    encore merci.

    EDIT : en fin de compte, je ne vais pas me servir de template nommé pour faire ça, je passe par des variables.
    ça répète du code, mais ça ne fait qu'une ligne, et elles sont regroupées, ce qui me permet de les repérer facilement.

    mais je vais refaire mon code en utilisant un template nommé, non pour du code qui se répète, mais pour réaliser des traitements différents sur des éléments qui ont le même nom, mais qui ont des données différentes.

    je vais cuisiner ça à ma sauce, ça me fera me faire la main.
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 18/04/2012, 12h18
  2. [JNA] Erreur lors de l'appel de fonction venant d'une librairie
    Par lac981 dans le forum Entrée/Sortie
    Réponses: 2
    Dernier message: 31/05/2011, 11h02
  3. Réponses: 2
    Dernier message: 17/09/2009, 14h50
  4. appeler plusieurs fonctions à partir d'une checkbox
    Par amelhog dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 25/05/2005, 16h10

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