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 :

[XSL] Enlever un noeud


Sujet :

XSL/XSLT/XPATH XML

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    78
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 78
    Points : 41
    Points
    41
    Par défaut [XSL] Enlever un noeud
    Bonjour à tous,

    j'en viens à vous écrire car je ne suis pas un expert du XSL et j'ai beaucoup de mal à effectuer une opération qui parait simple. En fait j'ai trouvé des exemples sur le net que je n'arrive pas à appliquer à mon fichier xml.

    L'opération est simple: enlever un noeud et tout ce qu'il contient d'un fichier xml généré par une application externe.

    Voila donc le fichier xml en question:
    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
    <?xml version="1.0" encoding="utf-8"?>
    <asmv1:assembly xsi:schemaLocation="urn:schemas-microsoft-com:asm.v1 assembly.adaptive.xsd" manifestVersion="1.0" xmlns:dsig="http://www.w3.org/2000/09/xmldsig#" xmlns="urn:schemas-microsoft-com:asm.v2" xmlns:asmv1="urn:schemas-microsoft-com:asm.v1" xmlns:asmv2="urn:schemas-microsoft-com:asm.v2" xmlns:xrml="urn:mpeg:mpeg21:2003:01-REL-R-NS" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
      <assemblyIdentity name="xxx.app" version="1.0.0.0" publicKeyToken="0000000000000000" language="neutral" processorArchitecture="x86" xmlns="urn:schemas-microsoft-com:asm.v1" />
      <description asmv2:publisher="xxx" asmv2:product="xxx" xmlns="urn:schemas-microsoft-com:asm.v1" />
      <deployment install="true">
        <subscription>
          <update>
            <expiration maximumAge="0" unit="days" />
          </update>
        </subscription>
        <deploymentProvider codebase="\\xxx" />
      </deployment>
      <dependency>
        <dependentAssembly dependencyType="install" codebase="xxx.manifest" size="55442">
          <assemblyIdentity name="xxx.exe" version="1.0.0.0" publicKeyToken="450d8c50b1fa6ae7" language="neutral" processorArchitecture="x86" type="win32" />
          <hash>
            <dsig:Transforms>
              <dsig:Transform Algorithm="urn:schemas-microsoft-com:HashTransforms.Identity" />
            </dsig:Transforms>
            <dsig:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1" />
            <dsig:DigestValue>Ujd6b30jvATCS8xLkdS4p+GHmZk=</dsig:DigestValue>
          </hash>
        </dependentAssembly>
      </dependency>
    </asmv1:assembly>
    et voici le fichier xsl que j'essaye d'appliquer:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
     
      <xsl:template match="subscription">
      </xsl:template>
     
      <!-- Copy all the attributes and other nodes -->
      <xsl:template match="@*|node()">
        <xsl:copy>
          <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
      </xsl:template>
     
    </xsl:stylesheet>
    J'ai fait des tests avec un fichier xml beaucoup plus simple, et j'y arrive.
    Pour information j'utilise XslTransform.exe (fourni avec Sandcastle) pour appliquer la transformation via un batch de la manière qui suit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    xsltransform /xsl:transform.xsl file.xml
    Merci d'avance pour votre aide.

  2. #2
    Membre expérimenté
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    1 466
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 1 466
    Points : 1 610
    Points
    1 610
    Par défaut
    C'était presque ça, juste un pb de déclaration de namespace dans le xsl :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"
    	xmlns:asmv2="urn:schemas-microsoft-com:asm.v2" >
    	<xsl:output method = "xml"  version="1.0" encoding="utf-8" omit-xml-declaration="no" standalone="no" indent="yes"  />
     
       <xsl:template match="asmv2:subscription">
       </xsl:template>
     
    <!-- Copy all the attributes and other nodes -->
       <xsl:template match="@*|node()">
          <xsl:copy>
             <xsl:apply-templates select="@*|node()" />
          </xsl:copy>
       </xsl:template>
    </xsl:stylesheet>

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    78
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 78
    Points : 41
    Points
    41
    Par défaut
    Je me doutait bien que cela venait de quelque chose comme ça, mais je n'arrivais pas à mettre le doigt dessus.

    Merci beaucoup, cela marche beaucoup mieux avec ta version

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    78
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 78
    Points : 41
    Points
    41
    Par défaut
    Je rencontre un nouveau problème avec mon histoire de transformation xsl.

    Plutôt que d'effacer le noeud en question, nous preferons maintenant le remplacer par un autre à savoir:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <subscription>
      <update>
        <expiration maximumAge="0" unit="days" />
      </update>
    </subscription>
    par ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <subscription>
      <update>
        <beforeApplicationStartup />
      </update>
    </subscription>
    pour ce faire, j'utilise donc la même règle que précédement à l'exception du nouveau noeud qui fait son apparition:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <xsl:template match="asmv2:expiration">
      <beforeApplicationStartup />
    </xsl:template>
    après passage de "xsltransform", je me retrouve avec cet output:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <subscription>
      <update>
        <beforeApplicationStartup xmlns="" />
      </update>
    </subscription>
    Le problème dans l'histoire, c'est que la mise à jour automatique via ClickOnce refuse de parser le document à cause de l'attribut xmlns="" qui a fait son apparition dans l'output.

    J'ai pas mal cherché déja (et je continue encore) comment faire pour que cet attribut ne soit pas généré, mais j'avoue ne pas y comprendre grand chose. Il semblerait que ce soit un attribut spécial qui utile aux namespace, mais aucune information sur comment le zapper.

    Pour information j'utilise donc "xsltransform" fourni avec Sandbox pour appliquer ma modification xsl.

    Merci d'avance pour toute information qui pourrait me permettre de régler ce problème.

    Bonne journée à tous!

  5. #5
    Membre expérimenté
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    1 466
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 1 466
    Points : 1 610
    Points
    1 610
    Par défaut
    En gros le principe des namespaces, mais c'est empirique donc je peux me tromer :
    Tous les noeuds d'un arbre appartiennent à un espace de nom (namespace).
    Si aucun n'est spécifié, c'est d'abord celui de son parent le plus proche et si aucun de n'en a, c'est celui par défaut, mais je connais plus son URI.

    En général on associe un namespace à un préfixe, cette déclaration correspond à la déclaration d'un attribut genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    xmlns:asmv2="urn:schemas-microsoft-com:asm.v2"
    Si on fait juste
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    xmlns="urn:schemas-microsoft-com:asm.v2"
    ca veut dire que le namespace par défaut du noeud courant et ses enfant devient "urn:schemas-microsoft-com:asm.v2".

    Dans ton cas précis, le xsl ne spécifie pas de namespace par défaut pour créer ses élement, il faut donc le spécifier (donc regarder celui par défaut de son plus proche parent):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    <xsl:template match="asmv2:expiration">
          <beforeApplicationStartup xmlns="urn:schemas-microsoft-com:asm.v2"/>
    </xsl:template>
    ou encore
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    <xsl:template match="asmv2:expiration">
          <asmv2:beforeApplicationStartup />
    </xsl:template>
    qui je pense est équivalent sémantiquement, même si différent syntaxiquement.

  6. #6
    Rédacteur

    Avatar de Erwy
    Homme Profil pro
    Développeur Web
    Inscrit en
    Novembre 2003
    Messages
    4 967
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2003
    Messages : 4 967
    Points : 10 927
    Points
    10 927
    Par défaut
    Pb classique de namespace, tu as spécifié des xmlns pour certaine balise mais celle que tu crées n'est pas couverte
    par rapport à ton fichier original je te dirais de mettre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <xsl:stylesheet xmlns="urn:schemas-microsoft-com:asm.v2"  xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0" xmlns:asmv2="urn:schemas-microsoft-com:asm.v2">
    mais tu peux remplacer xmlns="urn:schemas-microsoft-com:asm.v2" par autre chose si besoin

  7. #7
    Rédacteur

    Avatar de Erwy
    Homme Profil pro
    Développeur Web
    Inscrit en
    Novembre 2003
    Messages
    4 967
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2003
    Messages : 4 967
    Points : 10 927
    Points
    10 927
    Par défaut
    Citation Envoyé par Morbo
    En gros le principe des namespaces, mais c'est empirique donc je peux me tromer :
    Tous les noeuds d'un arbre appartiennent à un espace de nom (namespace).
    Si aucun n'est spécifié, c'est d'abord celui de son parent le plus proche et si aucun de n'en a, c'est celui par défaut, mais je connais plus son URI.
    Oui c'est ça mainteant les mélange préfixé pas préfixé c'est rien que du bonheur
    Les règles de namespaces suivent un peu les règles de localisation des varaibles pour les noeuds

    La règle pour les attributs est par contre différente.
    Pour qu'un attribut appartiennent à un autre que celui par défaut XML , il doit obligatoirement être préfixé (un xmlns="qqch" ne marchera donc pas pour lui)

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    78
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 78
    Points : 41
    Points
    41
    Par défaut
    un grand merci pour toutes ces précisions et cette réponse de qualité. Inutile de préciser que ça marche nickel et que du coup je me retrouve avec la bonne balise toute seule comme il faut.

    Merci beaucoup.

    ps:

    je précise que j'ai utilisé cette version:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <xsl:template match="asmv2:expiration">
          <beforeApplicationStartup xmlns="urn:schemas-microsoft-com:asm.v2"/>
    </xsl:template>

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

Discussions similaires

  1. [XSL] Enlever l'attribut xmlns pour une transf. XSL
    Par Acalon dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 24/04/2006, 14h21
  2. [XSL] egalité de noeud
    Par luta dans le forum XSL/XSLT/XPATH
    Réponses: 11
    Dernier message: 14/01/2006, 23h58
  3. [xml/xsl] Problème de noeuds et attributs
    Par Avallach dans le forum XSL/XSLT/XPATH
    Réponses: 5
    Dernier message: 14/01/2006, 14h31
  4. [XSL] Accès à un noeud dans une boucle
    Par Trin dans le forum XSL/XSLT/XPATH
    Réponses: 3
    Dernier message: 15/11/2005, 14h32
  5. xsl ---> filtrage des noeuds avec "not"
    Par yos dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 12/07/2005, 11h26

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