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 :

ajouter un attribut et lui affecter une valeur [XSLT 1.0]


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 ajouter un attribut et lui affecter une valeur
    Bonjour,

    je poursuis mes pérégrinations dans XSLT;

    je traite la sortie de nmap -sn -PR -oX - 192.168.1.0/24,
    or, parfois l'attribut @vendor n'existe pas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
        <host>
            <status state="up" reason="localhost-response"
            reason_ttl="0" />
            <address addr="192.168.1.98" addrtype="ipv4" />
            <hostnames>
                <hostname name="maMachine" type="PTR" /> <!--là, en général, il y a un attribut vendor, qui ici est absent; c'est normal -->
            </hostnames>
        </host>
    je voudrais donc lui donner une valeur par défaut pour, àmha, simplifier le code 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
    <?xml version="1.1"?>
     
    <xsl:stylesheet version="1.0"
        xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
     
        <xsl:output method="text" encoding="utf-8" />
     
        <xsl:variable name="linFeed" select="'&#xa;'" />
        <xsl:variable name="noV" select="'noVendor'" />
     
        <xsl:template match="nmaprun">
            <xsl:apply-templates select="host" />
        </xsl:template>
     
        <xsl:template match="host">
            <xsl:apply-templates select="address" />
        </xsl:template>
     
        <xsl:template match="address">
            <xsl:if test="@addrtype='mac'">
                <xsl:if test="not(@vendor)">
                    la condition est vrai : il n'y a pas d'attribut @vendor
                    <xsl:copy>
                        <xsl:attribute name="vendor">valeur par défaut</xsl:attribute>
                    </xsl:copy>
                </xsl:if>
                <xsl:value-of select="concat(@addr,' ; ',@vendor, $linFeed)" />
            </xsl:if>
        </xsl:template>
     
    </xsl:stylesheet>
    mais "ça marche pas" :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    _a:dr:es:se:_m:ac ; SFR
    _a:dr:es:se:_m:ac ; D-Link
    _a:dr:es:se:_m:ac ; SFR
    _a:dr:es:se:_m:ac ; Netgear
     
                    la condition est vrai : il n'y a pas d'attribut @vendor
                    _a:dr:es:se:_m:ac ;
    la condition fonctionne, mais pas l'affectation.

    une autre chose : si j'utilise select dans xsl:attribute, j'obtiens un core dumped, sans autre renseignement.
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  2. #2
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 551
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 607
    Points
    21 607
    Par défaut
    Hello,

    XSLT n'apporte aucune modification au document XML transformé, et ne peut donc rien faire qui ressemble à une "affectation". XSLT prend une entrée (un document XML) et génère une sortie (format XML/HTML/texte à choisir). C'est tout, rien d'autre. Le document est en lecture seule, pas seulement son fichier mais toutes les informations qu'il fournit aussi. Aucun changement possible.

    Il y a quand même une solution très simple, juste pas quelque chose qui essaie de "stocker une information par défaut quand l'information était manquante". Quand une information est manquante, elle le reste.

    Mais tu peux simplement définir une variable qui donne la valeur de cet attribut. Et comme valeur de cette variable, tu mets soit l'attribut s'il existe, soit la valeur par défaut sinon.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    <xsl:variable name="vendor">
      <xsl:choose>
        <xsl:when test="@vendor">
          <xsl:copy-of select="@vendor"/>
        </xsl:when>
        <xsl:otherwise>noVendor</xsl:otherwise>
      </xsl:choose>
    </xsl:variable>
     
    <xsl:value-of select="concat(@addr,' ; ',$vendor, $linFeed)" />
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  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
    je pensais pouvoir faire autrement.

    merci.

    je me suis donc trompé sur l'usage xsl:attribute.
    il ne permet pas d'ajouter un attribut, mais seulement de modifier un attribut existant, c'est ça ?
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  4. #4
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 551
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 607
    Points
    21 607
    Par défaut
    Bah euh, je viens de dire qu'on ne peut rien modifier.

    <xsl:attribute> permet de créer un attribut dans le but de le mettre dans la sortie. C'est un peu particulier parce que "mettre un attribut dans la sortie" ça ne peut pas se faire n'importe quand. Un attribut ne peut être que contenu par un élément ouvrant. Par conséquent, on ne peut ajouter un attribut que si on vient d'ouvrir un élément sans y avoir ajouté quoi que ce soit (sauf des attributs). L'attribut ajouté à ce moment est considéré comme appartenant à l'élément qui vient d'être ouvert.

    Mais de toute façon, il semble que ta sortie est au format texte, pas XML. La notion d'attribut n'existe pas en texte simple (ni d'ailleurs la notion d'élément, dont tu aurais besoin pour pouvoir y ajouter un attribut). Ça n'a donc aucun sens d'essayer de créer un attribut.

    (Bon, en réalité, certaines choses sont faisables en XSLT 2.0/3.0 quand on crée des attributs bien qu'on génère une sortie texte. On peut les mettre dans des variables et s'en servir plus tard de diverses façons. Mais en XSLT 1.0, c'est incapable de servir à quoi que ce soit.)
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  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
    W3Schools ne semble pas être d'accord
    XSLT <xsl:attribute> :
    The <xsl:attribute> element replaces existing attributes with equivalent names.
    je ne veux pas modifier le XML source, uniquement ce que lit XSLT au moment où il le lit pour, effectivement, qu'il l'affiche sur la sortie en texte.

    "la notion d'attribut n'existe pas en texte", j'en suis conscient, je lis du texte tout les jours et je n'y ai jamais vu d'attribut; pas comme ça en tout cas. :mdr:
    pourtant, j'arrive bien à les extraire du XML pour les afficher dans la console.

    il est un peu difficile, pour moi, de comprendre/d'admettre que quand je tente d'insérer une modification dans un "flux", elle ne puisse pas être prise en compte.
    "reflexes" de seder, peut-être : quand on passe un fichier à sed, on peut en mâchouiller "le contenu" à souhait, et le recracher comme on veut.

    EdiT: on peut faire des XSL"Transformation", mais on ne peut pas faire de "modification" ?
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  6. #6
    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'ai pris une mauvaise direction par manque de compréhension de XSLT, et finalement, à vouloir éviter les redites, je crée un monstre que je ne maîtrise pas.

    je vais rester sur les chemins que je connais, avec des variables, si je n'y trouve pas ce que je veux, j'y dis que ça n'y est pas. <-point

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

  7. #7
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 551
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 607
    Points
    21 607
    Par défaut
    Ok. Je vais quand meme donner des réponses au cas où ça serve.

    Citation Envoyé par N_BaH Voir le message
    W3Schools ne semble pas être d'accord
    Je suis navré d'être la personne qui doit t'apprendre que W3Schools raconte surtout des clowneries, ou un truc qui rime. Ce site n'est pas trop mal pour un petit débutant qui est très impressionné par tous ces trucs informatiques. Il permet de plonger dans les tutoriels et commencer à s'habituer.

    Mais un professionnel doit absolument aller ailleurs, chez des gens qui lui donneront des informations correctes et tant pis si c'est trop compliqué pour les enfants. Qu'est-ce qui t'empêche de regarder directement le W3C ? Pour un professionnel, XSLT 1.0 n'est pas très compliqué.

    Citation Envoyé par N_BaH Voir le message
    je ne veux pas modifier le XML source, uniquement ce que lit XSLT au moment où il le lit pour, effectivement, qu'il l'affiche sur la sortie en texte.
    Et donc, je crois comprendre que tu as compris, que XSLT ne te le permet pas.

    Citation Envoyé par N_BaH Voir le message
    il est un peu difficile, pour moi, de comprendre/d'admettre que quand je tente d'insérer une modification dans un "flux", elle ne puisse pas être prise en compte.
    "reflexes" de seder, peut-être : quand on passe un fichier à sed, on peut en mâchouiller "le contenu" à souhait, et le recracher comme on veut.
    Sed prend du texte en entrée et donne du texte en sortie. Quand tu fais des modifs "au milieu", ça n'a pas beaucoup de sens de s'interroger sur le fait que ces modifs soient faites sur le flux d'entrée ou sur le flux de sortie.

    XSLT prend du XML en entrée, et un format quelconque en sortie. Et le XML d'entrée n'est pas à proprement parler un flux. Il applique plutôt un genre de "règles CSS", bien qu'elles soient appelées "template" en XSLT. Certes ils sont appliqués dans l'ordre du document, mais on ne peut pas trop parler de flux. Une itération récursive tout au mieux.

    Citation Envoyé par N_BaH Voir le message
    EdiT: on peut faire des XSL"Transformation", mais on ne peut pas faire de "modification" ?
    C'est ça. Après, rien ne t'empêche de prendre un XML en entrée, et de donner en sortie un XML qui ressemble énormément à celui d'entrée, avec juste quelques différences. On pourrait facilement prendre ça comme une "modification".
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  8. #8
    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 pas bien de mentir aux enfants.

    « Qui a le droit, qui a le droit d'faire ça...»
    .
    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. Affecter une valeur d'attribut d'un objet à un autre
    Par wafiwafi dans le forum Général Java
    Réponses: 9
    Dernier message: 19/08/2011, 11h38
  2. [XSLT]Transformer une valeur d'attribut en élément
    Par heffer69 dans le forum XSL/XSLT/XPATH
    Réponses: 5
    Dernier message: 01/02/2008, 11h48
  3. [XSLT] modifier une valeur d'attribut
    Par aadariom dans le forum XSL/XSLT/XPATH
    Réponses: 1
    Dernier message: 03/10/2007, 12h24
  4. [XSLT] Comment attribuer une valeur à un attribut?
    Par citizen87 dans le forum XSL/XSLT/XPATH
    Réponses: 4
    Dernier message: 11/10/2006, 15h12
  5. [xslt] affecter la valeur d'un attribut HTML
    Par ouioui2000 dans le forum XSL/XSLT/XPATH
    Réponses: 1
    Dernier message: 16/12/2005, 10h49

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