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

XML/XSL et SOAP Discussion :

Xsd vers xsd avec xslt : comment ne pas positionner des balises partout


Sujet :

XML/XSL et SOAP

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2018
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2018
    Messages : 6
    Points : 8
    Points
    8
    Par défaut Xsd vers xsd avec xslt : comment ne pas positionner des balises partout
    Bonjour à tous,
    Je dois modifier un schéma XML pour ajouter et modifier quelques éléments. Notamment, je dois ajouter à tous les éléments des maxOccurs et ajouter entre chaque élément, un nouvel élément que j'ai moi-même créé (appelé balisesXrm). Pour ce faire, j'ai utilisé xslt comme vous pouvez le voir :

    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
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    <?xml version="1.0" encoding="UTF-8" ?>
     
    <!-- New XSLT document created with EditiX XML Editor (http://www.editix.com) at Wed Jun 27 15:55:16 CEST 2018 -->
     
    <xsl:stylesheet version="1.0" 
    	xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    	xmlns:xsd="http://www.w3.org/2001/XMLSchema"
    	xmlns:fn="http://www.w3.org/2005/xpath-functions"
    	xmlns:xdt="http://www.w3.org/2005/xpath-datatypes"
    	xmlns:err="http://www.w3.org/2005/xqt-errors"
    	exclude-result-prefixes="xsd xdt err fn"
    	xmlns:redirect="http://xml.apache.org/xalan/redirect"
    	extension-element-prefixes="redirect"
    	xmlns:xalan="http://xml.apache.org/xslt">
     
    	<!-- Pour avoir bonne indentation en sortie -->
     
    	<xsl:output method="xml" indent="yes" xalan:indent-amount="4"/>
     
     
    	<!-- Transformation identité -->
     
    	<xsl:template match="node()|@*">
            <xsl:copy>
                <xsl:apply-templates select="node()|@*"/>
            </xsl:copy>
        </xsl:template>
     
    	<!-- Création de nos nouveaux noeuds -->
        <xsl:template match="xsd:schema">
            <!-- on crée à nouveau le schema-->
            <xsl:element name="xsd:schema">
                <!-- on copie ce qu'il y avait déjà dans le schéma -->
                <xsl:copy-of select="@*"/>
                <!-- on remet tous les éléments enfants du schéma -->
                <xsl:apply-templates/>
                <!-- on crée notre propre branche pour appeler notre complexType-->
                <xsl:call-template name="lien2"/>
            </xsl:element>
        </xsl:template>
     
     
        <!-- création du complexType balisesXrm -->
    	 <xsl:template name="lien2">
        	<xsl:element name="xsd:element">
                <xsl:attribute name="name">balisesXrmType</xsl:attribute>
                	<xsl:element name="xsd:complexType">
                	<xsl:element name="xsd:sequence">
                        <xsl:element name="xsd:element">
                        	<xsl:attribute name="name">balisesXrm:attribut</xsl:attribute>
                        </xsl:element>
                        <xsl:element name="xsd:element">
                        	<xsl:attribute name="name">balisesXrm:variable</xsl:attribute>
                        </xsl:element>
                        <xsl:element name="xsd:element">
                        	<xsl:attribute name="name">balisesXrm:param</xsl:attribute>
                        </xsl:element>
                        <xsl:element name="xsd:element">
                        	<xsl:attribute name="name">balisesXrm:java</xsl:attribute>
                        </xsl:element>
                        <xsl:element name="xsd:element">
                        	<xsl:attribute name="name">balisesXrm:historisation-date</xsl:attribute>
                        </xsl:element>
                        <xsl:element name="xsd:any">
                        	<xsl:attribute name="minOccurs">0</xsl:attribute>
                        </xsl:element>
        			</xsl:element>
        			</xsl:element>
        	</xsl:element> 
        </xsl:template>
     
        <!-- pour chaque element, ajout maxOccurs avec valeur unbounded et ref et de la nouvelle balise -->
         <xsl:template match="xsd:element">
         		<xsl:element name="xsd:element">
             		<xsl:attribute name="name">balisesXrm</xsl:attribute>
             		<xsl:attribute name="type">t:balisesXrmType</xsl:attribute>
             	</xsl:element>
            <xsl:copy>
                <!-- ... on ajoute les maxOccurs ...-->
                <xsl:attribute name="maxOccurs">unbounded</xsl:attribute>
                <!-- ... on ajoute  l'attributeGroup "attributsXrm" en ref ...-->
                <xsl:attribute name="ref">attributsXrm</xsl:attribute>
                <!-- ... on copie tout en ne touchant pas au maxOccurs (pas besoin de spécifier ref pcq aussi là) -->
                <xsl:apply-templates select="node()| @*[not(name() = 'maxOccurs')]" />
            </xsl:copy>
        </xsl:template>
     
    </xsl:stylesheet>
    J'applique donc ce fichier xslt au schéma 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
     
    <?xml version="1.0" encoding="UTF-8"?>
     
    <xsd:complexType name="typeAssociation">
        <xsd:sequence>
            <xsd:element name="refid" type="xsd:QName"/>
        </xsd:sequence>
    </xsd:complexType>
    <xsd:complexType SCCOAMCD:desc="administratif" SCCOAMCD:entite="A-SC.ElementControle" name="ElementControle">
        <xsd:sequence>
            <xsd:element SCCOAMCD:desc="a_pour_etat" SCCOAMCD:relation="A-SC.ElementControle,EtatEltControle" maxOccurs="1" minOccurs="1" name="a_pour_etat" type="SBEGestionZonesAeriennesSYSCA:EtatEltControle"/>
        </xsd:sequence>
    </xsd:complexType>
    <xsd:complexType SCCOAMCD:desc="Etat" SCCOAMCD:entite="A-SC.Etat" name="Etat">
        <xsd:sequence>
            <xsd:element SCCOAMCD:attribut="A-SC.Etat.Commentaires" SCCOAMCD:desc="Commentaires" maxOccurs="1" minOccurs="0" name="commentaires" type="SBEGestionZonesAeriennesSYSCA:typeDatatypeChaine1a2000"/>
            <xsd:element SCCOAMCD:attribut="A-SC.Etat.GdhDebut" SCCOAMCD:desc="Date validité" maxOccurs="1" minOccurs="1" name="gdhDebut" type="typeDTG"/>
            <xsd:element SCCOAMCD:attribut="A-SC.Etat.GdhFin" SCCOAMCD:desc="retour opé" maxOccurs="1" minOccurs="0" name="gdhFin" type="typeDTG"/>
        </xsd:sequence>
    </xsd:complexType>
    <xsd:complexType SCCOAMCD:desc="Description" SCCOAMCD:entite="A-SC.EtatEltControle" name="EtatEltControle">
        <xsd:complexContent>
            <xsd:extension SCCOAMCD:entite="A-SC.Etat" base="SBEGestionZonesAeriennesSYSCA:Etat">
                <xsd:sequence>
                    <xsd:element SCCOAMCD:attribut="A-SC.EtatEltControle.Etat" SCCOAMCD:desc="controle" maxOccurs="1" minOccurs="1" name="etat" type="typeString"/>
                </xsd:sequence>
            </xsd:extension>
        </xsd:complexContent>
    </xsd:complexType>
    <xsd:element name="SBEGestionZonesAeriennesSYSCA" type="SBEGestionZonesAeriennesSYSCA:type_SBEGestionZonesAeriennesSYSCA"/>
    </xsd:schema>
    Et j'obtiens :
    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
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
     
    <?xml version="1.0" encoding="utf-8"?>
    <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:SCCOAMCD="urn:SCCOA-schemaInfo" SCCOAMCD:desc="  implémentation du MCD pivot du SCCOA 3.2.1ec  production par SCCOA mcd2mpd 4.1.1, le 11/12/2007  règles spécifiques production schémas 1.2  diagramme : A-SC.SBE GestionZonesAeriennes SYSCA  entité racine      : A-SC.ZoneAerienne " attributeFormDefault="unqualified" elementFormDefault="qualified" targetNamespace="urn:SBEGestionZonesAeriennesSYSCA-schema" version="3.2.1ec">
     
       <xsd:complexType xmlns="urn:SBEGestionZonesAeriennesSYSCA-schema" xmlns:SBEGestionZonesAeriennesSYSCA="urn:SBEGestionZonesAeriennesSYSCA-schema" name="typeAssociation">
     
          <xsd:sequence>
     
             <xsd:element name="balisesXrm" type="t:balisesXrmType"/>
             <xsd:element maxOccurs="unbounded" ref="attributsXrm" name="refid" type="xsd:QName"/>
     
          </xsd:sequence>
     
       </xsd:complexType>
     
       <xsd:complexType xmlns="urn:SBEGestionZonesAeriennesSYSCA-schema" xmlns:SBEGestionZonesAeriennesSYSCA="urn:SBEGestionZonesAeriennesSYSCA-schema" SCCOAMCD:desc="Une caractéristique intangible d'intérêt militaire qui est spécifiée administrativement, peut être représentée par une figure géométrique, et est associée à la conduite des opérations militaires" SCCOAMCD:entite="A-SC.ElementControle" name="ElementControle">
     
          <xsd:sequence>
     
             <xsd:element name="balisesXrm" type="t:balisesXrmType"/>
             <xsd:element maxOccurs="unbounded" ref="attributsXrm" SCCOAMCD:desc="a_pour_etat" SCCOAMCD:relation="A-SC.ElementControle,EtatEltControle" minOccurs="1" name="a_pour_etat" type="SBEGestionZonesAeriennesSYSCA:EtatEltControle"/>
     
          </xsd:sequence>
     
       </xsd:complexType>
     
       <xsd:complexType xmlns="urn:SBEGestionZonesAeriennesSYSCA-schema" xmlns:SBEGestionZonesAeriennesSYSCA="urn:SBEGestionZonesAeriennesSYSCA-schema" SCCOAMCD:desc="Etat" SCCOAMCD:entite="A-SC.Etat" name="Etat">
     
          <xsd:sequence>
     
             <xsd:element name="balisesXrm" type="t:balisesXrmType"/>
             <xsd:element maxOccurs="unbounded" ref="attributsXrm" SCCOAMCD:attribut="A-SC.Etat.Commentaires" SCCOAMCD:desc="Commentaires sur l'état" minOccurs="0" name="commentaires" type="SBEGestionZonesAeriennesSYSCA:typeDatatypeChaine1a2000"/>
     
             <xsd:element name="balisesXrm" type="t:balisesXrmType"/>
             <xsd:element maxOccurs="unbounded" ref="attributsXrm" SCCOAMCD:attribut="A-SC.Etat.GdhDebut" SCCOAMCD:desc="Date début de validité de l'état" minOccurs="1" name="gdhDebut" type="typeDTG"/>
     
             <xsd:element name="balisesXrm" type="t:balisesXrmType"/>
             <xsd:element maxOccurs="unbounded" ref="attributsXrm" SCCOAMCD:attribut="A-SC.Etat.GdhFin" SCCOAMCD:desc="GDH estimé du retour opérationnel ou date prochain état" minOccurs="0" name="gdhFin" type="typeDTG"/>
     
          </xsd:sequence>
     
       </xsd:complexType>
     
       <xsd:complexType xmlns="urn:SBEGestionZonesAeriennesSYSCA-schema" xmlns:SBEGestionZonesAeriennesSYSCA="urn:SBEGestionZonesAeriennesSYSCA-schema" SCCOAMCD:desc="Description de l'état d'une zone ou d'une sous zone " SCCOAMCD:entite="A-SC.EtatEltControle" name="EtatEltControle">
     
          <xsd:complexContent>
     
             <xsd:extension SCCOAMCD:entite="A-SC.Etat" base="SBEGestionZonesAeriennesSYSCA:Etat">
     
                <xsd:sequence>
     
                   <xsd:element name="balisesXrm" type="t:balisesXrmType"/>
                   <xsd:element maxOccurs="unbounded" ref="attributsXrm" SCCOAMCD:attribut="A-SC.EtatEltControle.Etat" SCCOAMCD:desc="Dictionnaire précisant l'état de disponibilité d'un élément de contrôle" minOccurs="1" name="etat" type="typeString"/>
     
                </xsd:sequence>
     
             </xsd:extension>
     
          </xsd:complexContent>
     
       </xsd:complexType>
     
       <xsd:complexType xmlns="urn:SBEGestionZonesAeriennesSYSCA-schema" xmlns:SBEGestionZonesAeriennesSYSCA="urn:SBEGestionZonesAeriennesSYSCA-schema" SCCOAMCD:desc="Portion de l'espace aérien pour lequel peuvent-être définis :" SCCOAMCD:entite="A-SC.ZoneAerienne" name="ZoneAerienne">
     
          <xsd:complexContent>
     
             <xsd:extension SCCOAMCD:entite="A-SC.ElementControle" base="SBEGestionZonesAeriennesSYSCA:ElementControle">
     
                <xsd:sequence>
     
                   <xsd:element name="balisesXrm" type="t:balisesXrmType"/>
                   <xsd:element maxOccurs="unbounded" ref="attributsXrm" SCCOAMCD:attribut="A-SC.ZoneAerienne.Code" SCCOAMCD:desc="Code identifiant la zone Aérienne de manière unique hors ACO et ATO" minOccurs="1" name="code" type="SBEGestionZonesAeriennesSYSCA:typeDatatypeChaine1a30"/>
                </xsd:sequence>
             </xsd:extension>
          </xsd:complexContent>
       </xsd:complexType>
     
       <xsd:element name="balisesXrm" type="t:balisesXrmType"/>
       <xsd:element xmlns="urn:SBEGestionZonesAeriennesSYSCA-schema" xmlns:SBEGestionZonesAeriennesSYSCA="urn:SBEGestionZonesAeriennesSYSCA-schema" maxOccurs="unbounded" ref="attributsXrm" name="SBEGestionZonesAeriennesSYSCA" type="SBEGestionZonesAeriennesSYSCA:type_SBEGestionZonesAeriennesSYSCA"/>
     
       <xsd:element name="balisesXrmType">
          <xsd:complexType>
             <xsd:sequence>
                <xsd:element name="balisesXrm:attribut"/>
                <xsd:element name="balisesXrm:variable"/>
                <xsd:element name="balisesXrm:param"/>
                <xsd:element name="balisesXrm:java"/>
                <xsd:element name="balisesXrm:historisation-date"/>
                <xsd:any minOccurs="0"/>
             </xsd:sequence>
          </xsd:complexType>
       </xsd:element>
    Mon problème. Je ne veux pas les maxOccurs dans les éléments en dehors des séquences, sinon j'obtiens une erreur lorsque j'essaie de valider mon schéma. En essayant de créer 2 template (un pour /sequence/element et l'autre pour /element) une règle de priorité s'applique et je n'ajoute plus les balisesXrm.
    En espérant que quelqu'un pourra m'aider juste pour enlever le maxOccurs en dehors de la sequence.
    Merci d'avance.

  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
    Le schéma montré est incomplet et manque des infos nécessairement là, donc, je ne peux pas s'assurer ce que je propose de faire est suffisent à lui seul.
    Mon problème. Je ne veux pas les maxOccurs dans les éléments en dehors des séquences, sinon j'obtiens une erreur lorsque j'essaie de valider mon schéma.
    Bien entendu, ce serait une erreur si l'élément xsd:element dit global, c'est-à-dire enfant direct de l'élément xsd:schema (la racine), contient les facets cardinaux, y compris maxOccurs ou, d'ailleurs, minOccurs.

    On peut le faire comme ça pour excluer les éléments globaux avec un simple xsl:if.
    Code xml : 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
        <!-- pour chaque element, ajout maxOccurs avec valeur unbounded et ref et de la nouvelle balise -->
         <xsl:template match="xsd:element">
         		<xsl:element name="xsd:element">
             		<xsl:attribute name="name">balisesXrm</xsl:attribute>
             		<xsl:attribute name="type">t:balisesXrmType</xsl:attribute>
             	</xsl:element>
            <xsl:copy>
                <xsl:if test="not(parent::xsd:schema)">
                    <!-- ... on ajoute les maxOccurs ...-->
                    <xsl:attribute name="maxOccurs">unbounded</xsl:attribute>
                </xsl:if>
                <!-- ... on ajoute  l'attributeGroup "attributsXrm" en ref ...-->
                <xsl:attribute name="ref">attributsXrm</xsl:attribute>
                <!-- ... on copie tout en ne touchant pas au maxOccurs (pas besoin de spécifier ref pcq aussi là) -->
                <xsl:apply-templates select="node()| @*[not(name() = 'maxOccurs')]" />
            </xsl:copy>
        </xsl:template>

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2018
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2018
    Messages : 6
    Points : 8
    Points
    8
    Par défaut
    Ca fonctionne, merci beaucoup.
    Je cherchais comment aller chercher là où je voulais dans l'arbre alors qu'en effet la négation fonctionne (et est finalement plus simple).
    Merci encore !

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

Discussions similaires

  1. Problème pour affichage avec Eval()
    Par arngrimur dans le forum ASP.NET
    Réponses: 2
    Dernier message: 26/10/2011, 12h13
  2. Réponses: 2
    Dernier message: 19/03/2008, 11h58
  3. Bouton avec image - Problème pour la taille
    Par Sangdrax1604 dans le forum Balisage (X)HTML et validation W3C
    Réponses: 1
    Dernier message: 18/10/2006, 14h32
  4. [XSLT]Problèmes pour regrouper selon l'attribut
    Par gharl dans le forum XSL/XSLT/XPATH
    Réponses: 7
    Dernier message: 21/08/2006, 21h39
  5. [XSLT][XSD>XML]transformer xsd en xml avec xslt
    Par émile-henri dans le forum XSL/XSLT/XPATH
    Réponses: 7
    Dernier message: 14/06/2005, 15h06

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