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 :

Transformation XSD -> XSD [XSLT 1.0]


Sujet :

XSL/XSLT/XPATH XML

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Rédacteur
    Avatar de Giovanny Temgoua
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2003
    Messages
    3 830
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2003
    Messages : 3 830
    Par défaut Transformation XSD -> XSD
    Bonjour,

    Je vous sollicite parce que j'ai besoin d'aide pour réaliser une transformation dans des milliers de fichiers XSD.

    L'idée m'est venue d'écrire un XSLT (). Comme c'est la première fois, je n'arrive pas à trouver le bon mécanisme.

    Objectif : pour tous les xs:complexType ne possédant qu'un seul xs:choice, remplacer ce dernier par un xs:sequence. Recopier tel quel sinon.

    J'ai effectué divers essais mais rien qui soit vraiment concluant.

    XSLT est-elle la meilleure approche pour ce type de transformation ? Y-a-il plus simple ? (la rapidité n'est pas un critère important).

    Merci d'avance,

  2. #2
    Membre Expert Avatar de tsuji
    Inscrit en
    Octobre 2011
    Messages
    1 558
    Détails du profil
    Informations forums :
    Inscription : Octobre 2011
    Messages : 1 558
    Par défaut
    C'est fait avec un template specifique à côté des templates courants plus généraux, possiblement mais pas nécessairement pour la functionalité d'une transformation identique.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    <xsl:template match="xs:choice[parent::xs:complexType and count(parent::xs:complexType/xs:choice)=1]">
        <xs:sequence>
            <xsl:apply-templates select="node()|@*|comment()|processing-instruction()" />
        </xs:sequence>
    </xsl:template>

  3. #3
    Rédacteur
    Avatar de Giovanny Temgoua
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2003
    Messages
    3 830
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2003
    Messages : 3 830
    Par défaut
    Merci pour ta réponse.

    Avec le bout de code, je ne vois pas comment mettre en place le template qui fera la copie "du reste" du XSD qui ne vérifie pas la condition.

    J'ai fais des essais avec :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <xsl:copy>
        <xsl:apply-templates select="* | @*"/>
      </xsl:copy>
    Mais je n'ai pas du tout le résultat escompté.

    Aurais-tu une suggestion à me faire stp ?

    Merci d'avance,

    Ci-dessous la structure exacte d'un ComplexType :

    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
     
    	<xs:complexType name="CT1">
    		<xs:complexContent>
    			<xs:extension base="BaseField">
    				<xs:choice>
    					<xs:element name="Name1" type="FieldType1">
    						<xs:annotation>
    							<xs:appinfo>
    								<info:Tag value="2E5"/>
    							</xs:appinfo>
    						</xs:annotation>
    					</xs:element>
    				</xs:choice>
    			</xs:extension>
    		</xs:complexContent>

  4. #4
    Membre Expert Avatar de tsuji
    Inscrit en
    Octobre 2011
    Messages
    1 558
    Détails du profil
    Informations forums :
    Inscription : Octobre 2011
    Messages : 1 558
    Par défaut
    Il faut savoir que le parent de xs:choice peut être xs:complexType, mais pas seulement comme ce que tu est en traîne de travailler avec. Dans ce cas, on doit poser la question avec plus de précision: comme par example généralement dans tout les cas xs:choice est le seul enfant sans sibling du même genre (xs:choice).
    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
     
    <xsl:stylesheet version="1.0"
        xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
        xmlns:xs="http://www.w3.org/2001/XMLSchema"
    >
    <xsl:output method="xml" encoding="utf-8" indent="yes" />
    <xsl:strip-space elements="*" />
    <xsl:template match="/">
        <xsl:apply-templates select="node()|comment()|processing-instruction()" />
    </xsl:template>
    <xsl:template match="node()|@*|comment()|processing-instruction()">
        <xsl:copy>
            <xsl:apply-templates select="node()|@*|comment()|processing-instruction()" />
        </xsl:copy>
    </xsl:template>
    <xsl:template match="xs:choice[count(parent::*/xs:choice)=1]">
        <xs:sequence>
            <xsl:apply-templates select="node()|@*|comment()|processing-instruction()" />
        </xs:sequence>
    </xsl:template>
    </xsl:stylesheet>
    Là tu peut voir ce que c'est le reste qui complète la fonctionnement, une transformation identique.

    Il se peut aussi faire un cas très spécifique plutot que le plus général comme ci-desus: dans le cas seulement ce que tu montres.
    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
     
    <xsl:stylesheet version="1.0"
        xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
        xmlns:xs="http://www.w3.org/2001/XMLSchema"
    >
    <xsl:output method="xml" encoding="utf-8" indent="yes" />
    <xsl:strip-space elements="*" />
    <xsl:template match="/">
        <xsl:apply-templates select="node()|comment()|processing-instruction()" />
    </xsl:template>
    <xsl:template match="node()|@*|comment()|processing-instruction()">
        <xsl:copy>
            <xsl:apply-templates select="node()|@*|comment()|processing-instruction()" />
        </xsl:copy>
    </xsl:template>
    <xsl:template match="xs:choice[parent::xs:extension[@base='BaseField'] and count(parent::*/xs:choice)=1]">
        <xs:sequence>
            <xsl:apply-templates select="node()|@*|comment()|processing-instruction()" />
        </xs:sequence>
    </xsl:template>
    </xsl:stylesheet>
    On se peut imaginer tous les cas intermédiaires, bien entendu.

  5. #5
    Rédacteur
    Avatar de Giovanny Temgoua
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2003
    Messages
    3 830
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2003
    Messages : 3 830
    Par défaut
    Merci Tsuji! Ton code m'a beaucoup aidé.

    Les premiers tests sont concluants. Je reviendrai (très probablement) vers toi si j'ai une interrogation

    Comme j'ai une autre question sur un autre sujet, je vais la poster dans un autre thread.

    Merci

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

Discussions similaires

  1. [XSD] Tutoriel XSD
    Par Anubis dans le forum Valider
    Réponses: 6
    Dernier message: 29/09/2011, 16h26
  2. [XSD] Transformer XML en XSD
    Par tom_tom73 dans le forum Valider
    Réponses: 5
    Dernier message: 04/11/2009, 08h40
  3. [XSLT] Transformation d'un XSD
    Par ALX79 dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 05/10/2007, 11h19
  4. [XSD] Transformation XML vers XSD
    Par sabrina1973 dans le forum Format d'échange (XML, JSON...)
    Réponses: 3
    Dernier message: 23/08/2006, 15h30
  5. [XSD] définition XSD et champ conditionné
    Par Mustik dans le forum Valider
    Réponses: 1
    Dernier message: 01/03/2006, 14h22

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