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 :
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
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>
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 <?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>
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.
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>
En espérant que quelqu'un pourra m'aider juste pour enlever le maxOccurs en dehors de la sequence.
Merci d'avance.
Partager