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.