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] modification d'un préfixe namespace XML [FAQ]


Sujet :

XSL/XSLT/XPATH XML

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Juin 2005
    Messages
    275
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 275
    Par défaut [XSLT] modification d'un préfixe namespace XML
    J'ai fait une application qui, entre autres, importe des fichiers XML dans une base Access qu'elle crée elle même. Pour que cela fonctionne (merci Access....), l'attribut doit obligatoirement valoir
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    http://www.w3.org/2000/10/XMLSchema-instance
    Jusque là, tout se tient. Par la suite les choses se compliquent : une fois mon importation de ces fichiers terminée, je voudrais mettre à jour la valeur de l'attribut wmlns : xsi, pour qu'il prenne la valeur de la derniere norme, c'est-à-dire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    http://www.w3.org/2001/XMLSchema-instance
    J'ai donc fait un fichier XSLT qui remplace la valeur 2000/10 par la valeur 2001. Le fichier XSLT est le suivant
    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
    <?xml version="1.0" encoding="ISO-8859-1"?>
    <xsl:transform  version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    	<xsl:output method="xml" version="1.0" encoding="ISO-8859-15" indent="yes"/>
    	<xsl:template match="node()" priority="1">
    		<xsl:copy>
    			<xsl:apply-templates select="node()|@*"/>
    		</xsl:copy>
    	</xsl:template>
    	<!-- règles pour les contenus de balise : on recopie -->
    	<xsl:template match="text()" priority="1">
    		<xsl:value-of select="."/> 
    	</xsl:template>
    	<!-- regle pour les balises : on recopie -->
    	<xsl:template match="@*" priority="1">
    		 <xsl:attribute name="{name()}">
    			<xsl:call-template name="Replace">
    				<xsl:with-param name="chaine" select="."></xsl:with-param>
    				<xsl:with-param name="chaineCherche" select="'2000/10'"></xsl:with-param>
    				<xsl:with-param name="chaineRempl" select="'2001'"></xsl:with-param>	
    			</xsl:call-template>
    		</xsl:attribute> 
    	<!--<xsl:attribute name="{name()}"><xsl:value-of select="."/></xsl:attribute>-->
    	</xsl:template>	
    	<xsl:template name="Replace">
    	<!--remplace une chaine par une autre-->
    		<xsl:param name="chaine"/>
    		<xsl:param name="chaineCherche"/>
    		<xsl:param name="chaineRempl"/>
    		<xsl:choose>
    			<xsl:when test="contains($chaine,$chaineCherche) ">
    				<xsl:call-template name="Replace">
    					<xsl:with-param name="chaine" select="concat(substring-before($chaine,$chaineCherche),$chaineRempl,substring-after($chaine,$chaineCherche))"/>
    					<xsl:with-param name="chaineCherche" select="$chaineCherche"/>
    					<xsl:with-param name="chaineRempl" select="$chaineRempl"/>
    				</xsl:call-template>
    			</xsl:when>
    			<xsl:otherwise>
    				<xsl:value-of select="$chaine"/>
    			</xsl:otherwise>
    		</xsl:choose>
    	</xsl:template>
    </xsl:transform>

    Problème, l'attribut que je veux modifier à l'air d'être le seul à ne pouvoir subir de modification....
    En effet, à partir du fichier
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    <?xml version="1.0" encoding="ISO-8859-15"?>
    <ElementsRecuperes 
      xsi:noNamespaceSchemaLocation="2000/10070503-103732-export.xsd" 
      xmlns:xsi="http://www.w3.org/2000/10/XMLSchema-instance">
    ...
    ...
    j'aboutit au fichier
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    <?xml version="1.0" encoding="ISO-8859-15"?>
    <ElementsRecuperes 
      xmlns:xsi="http://www.w3.org/2000/10/XMLSchema-instance" 
      xsi:noNamespaceSchemaLocation="2001070503-103732-export.xsd">
    ...
    ...

  2. #2
    Membre émérite
    Inscrit en
    Octobre 2005
    Messages
    847
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 847
    Par défaut
    je n'ai pas regardé tu peux faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <xsl:with-param name="chaine" select="."></xsl:with-param>
    <xsl:with-param name="chaineCherche" select="'http://www.w3.org/2000/10/XMLSchema-instance'"></xsl:with-param>
    <xsl:with-param name="chaineRempl" select="'http://www.w3.org/2001/XMLSchema-instance'"></xsl:with-param>

  3. #3
    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
    Changer la valeur d'un namespace n'est pas possible par simple substitution.

    Je vois deux pistes :
    • une transformation de type "identité" pour tout copier d'un namespace à l'autre
    • une méchante substitution de chaine de caractères par un langage de programmation standard (solution que je n'hésiterais pas à prendre...)

  4. #4
    Membre confirmé
    Inscrit en
    Juin 2005
    Messages
    275
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 275
    Par défaut
    Citation Envoyé par alain.couthures
    Changer la valeur d'un namespace n'est pas possible par simple substitution.

    Je vois deux pistes :
    • une transformation de type "identité" pour tout copier d'un namespace à l'autre
    • une méchante substitution de chaine de caractères par un langage de programmation standard (solution que je n'hésiterais pas à prendre...)
    Merci d'avoir pris le temps de regarder le post et d'y répondre.

    Pour ce qui est de la deuxième piste, un VBScript devrait faire l'affaire (pas d'installation nécessaire, besoins formulés réalisables simplement, temps d'exécution satisfaisants, etc.)

    Mais avant de décider définitivement, j'aimerais en savoir plus sur la première solution que tu préconises (la transformation de type "identité"). En fait, je n'ai pas compris en quoi elle consistait.

  5. #5
    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
    Voilà ce que peut donner l'approche par transformation identité :
    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
     <xsl:stylesheet version="1.0" txs:name="ns_replace">
      <xsl:variable name="ns1" select="'http://www.w3.org/2000/10/XMLSchema-instance'"/>
      <xsl:variable name="ns2" select="'http://www.w3.org/2001/XMLSchema-instance'"/>
      <xsl:template match="*">
       <xsl:choose>
        <xsl:when test="namespace-uri()=$ns1">
         <xsl:element name="{local-name()}" namespace="{$ns2}">
          <xsl:apply-templates select="@*|node()"/>
         </xsl:element>
        </xsl:when>
        <xsl:otherwise>
         <xsl:copy>
          <xsl:apply-templates select="@*|node()"/>
         </xsl:copy>
        </xsl:otherwise>
       </xsl:choose>
      </xsl:template>
      <xsl:template match="@*">
       <xsl:choose>
        <xsl:when test="namespace-uri()=$ns1">
         <xsl:attribute name="{local-name()}" namespace="{$ns2}">
          <xsl:apply-templates select="@*|node()"/>
         </xsl:attribute>
        </xsl:when>
        <xsl:otherwise>
         <xsl:copy>
          <xsl:apply-templates select="@*|node()"/>
         </xsl:copy>
        </xsl:otherwise>
       </xsl:choose>
      </xsl:template>
     </xsl:stylesheet>
    mais je ne trouve pas ça bien satisfaisant car ça reste le bazar avec les préfixes...

  6. #6
    Membre confirmé
    Inscrit en
    Juin 2005
    Messages
    275
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 275
    Par défaut
    Malheureusement ça ne fonctionne pas.

    J'obtiens
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    <?xml version="1.0" encoding="ISO-8859-15"?>
    <ElementsRecuperes xmlns:xsi="http://www.w3.org/2000/10/XMLSchema-instance">
      <noNamespaceSchemaLocation xmlns="http://www.w3.org/2001/XMLSchema-instance"/>
    etc.
    alors que j'espère toujours aboutir à
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    <?xml version="1.0" encoding="ISO-8859-15"?>
    <ElementsRecuperes xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
      xsi:noNamespaceSchemaLocation="20070502-164655-export.xsd">
    etc.

  7. #7
    Membre confirmé
    Inscrit en
    Juin 2005
    Messages
    275
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 275
    Par défaut
    Citation Envoyé par valal
    je n'ai pas regardé tu peux faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <xsl:with-param name="chaine" select="."></xsl:with-param>
    <xsl:with-param name="chaineCherche" select="'http://www.w3.org/2000/10/XMLSchema-instance'"></xsl:with-param>
    <xsl:with-param name="chaineRempl" select="'http://www.w3.org/2001/XMLSchema-instance'"></xsl:with-param>
    J'ai déjà essayé dès le départ, ça ne fonctionne pas. En fait, je peux modifier tout élément de mon fichier XML, à l'exception du namespace. C'est pourtant ce que je dois faire changer...

Discussions similaires

  1. [XSLT][OpenOffice] Problème filtre d'export XML
    Par Maximil ian dans le forum XSL/XSLT/XPATH
    Réponses: 7
    Dernier message: 04/06/2011, 20h10
  2. [XSLT] Ne pas interpréter les namespaces du XML généré ?
    Par Invité dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 06/09/2007, 18h24
  3. Réponses: 7
    Dernier message: 27/04/2007, 10h01
  4. [XSLT] Probleme de selection avec namespaces
    Par Ludo_xml dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 01/06/2005, 14h32
  5. [XSLT] Récupération du nom du fichier XML analysé
    Par Patkaza dans le forum XSL/XSLT/XPATH
    Réponses: 4
    Dernier message: 26/01/2005, 11h28

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