Я новый пользователь XML, stackoverflow спас меня во многих моментах, но у меня все еще есть некоторые проблемы.
Я пытаюсь преобразовать следующую схему XML, чтобы добавить перед все элемент новый тег 'balisesXrm' и добавить атрибут 'maxOccurs' для каждого элемента в последовательности :
<?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>
Я написал это xslt:
<?xml version="1.0" encoding="UTF-8" ?>
<!-- Identity transform -->
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<!-- New nodes -->
<xsl:template match="xsd:schema">
<!-- schema-->
<xsl:element name="xsd:schema">
<xsl:copy-of select="@*"/>
<xsl:apply-templates/>
<xsl:call-template name="lien2"/>
</xsl:element>
</xsl:template>
<!-- création du complexType balisesXrm -->
<xsl:template name="lien2">
<xsl:element name="xsd:complexType">
<xsl:attribute name="name">balisesXrmType</xsl:attribute>
<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:template>
<xsl:template match="xsd:element">
<xsl:element name="xsd:element">
<xsl:attribute name="name">balisesXrm</xsl:attribute>
<xsl:attribute name="type">balisesXrmType</xsl:attribute>
</xsl:element>
<xsl:copy>
<xsl:apply-templates select="@* | *"/>
</xsl:copy>
</xsl:template>
<!-- add maxOccurs values unbounded -->
<xsl:template match="xsd:sequence/xsd:element">
<xsl:copy>
<!-- ... maxOccurs ...-->
<xsl:attribute name="maxOccurs">unbounded</xsl:attribute>
<!-- ... copy all-->
<xsl:apply-templates select="node()| @*[not(name() = 'maxOccurs')]" />
</xsl:copy>
</xsl:template>
</xsl stylesheet>
и я получаю это:
<?xml version="1.0" encoding="utf-8"?>
<complexType name="typeAssociation">
<sequence>
<xsd:element xmlns="urn:SBEGestionZonesAeriennesSYSCA-schema" xmlns:SBEGestionZonesAeriennesSYSCA="urn:SBEGestionZonesAeriennesSYSCA-schema" maxOccurs="unbounded" name="refid" type="xsd:QName"/>
</sequence>
</complexType>
<complexType SCCOAMCD:desc="administratif" SCCOAMCD:entite="A-SC.ElementControle" name="ElementControle">
<sequence>
<xsd:element xmlns="urn:SBEGestionZonesAeriennesSYSCA-schema" xmlns:SBEGestionZonesAeriennesSYSCA="urn:SBEGestionZonesAeriennesSYSCA-schema" maxOccurs="unbounded" SCCOAMCD:desc="a_pour_etat" SCCOAMCD:relation="A-SC.ElementControle,EtatEltControle" minOccurs="1" name="a_pour_etat" type="SBEGestionZonesAeriennesSYSCA:EtatEltControle"/>
</sequence>
</complexType>
<complexType SCCOAMCD:desc="Etat" SCCOAMCD:entite="A-SC.Etat" name="Etat">
<sequence>
<xsd:element xmlns="urn:SBEGestionZonesAeriennesSYSCA-schema" xmlns:SBEGestionZonesAeriennesSYSCA="urn:SBEGestionZonesAeriennesSYSCA-schema" maxOccurs="unbounded" SCCOAMCD:attribut="A-SC.Etat.Commentaires" SCCOAMCD:desc="Commentaires sur l'état" minOccurs="0" name="commentaires" type="SBEGestionZonesAeriennesSYSCA:typeDatatypeChaine1a2000"/>
<xsd:element xmlns="urn:SBEGestionZonesAeriennesSYSCA-schema" xmlns:SBEGestionZonesAeriennesSYSCA="urn:SBEGestionZonesAeriennesSYSCA-schema" maxOccurs="unbounded" SCCOAMCD:attribut="A-SC.Etat.GdhDebut" SCCOAMCD:desc="Date validité" minOccurs="1" name="gdhDebut" type="typeDTG"/>
<xsd:element xmlns="urn:SBEGestionZonesAeriennesSYSCA-schema" xmlns:SBEGestionZonesAeriennesSYSCA="urn:SBEGestionZonesAeriennesSYSCA-schema" maxOccurs="unbounded" SCCOAMCD:attribut="A-SC.Etat.GdhFin" SCCOAMCD:desc="retour opé" minOccurs="0" name="gdhFin" type="typeDTG"/>
</sequence>
</complexType>
<complexType SCCOAMCD:desc="Description" SCCOAMCD:entite="A-SC.EtatEltControle" name="EtatEltControle">
<complexContent>
<extension SCCOAMCD:entite="A-SC.Etat" base="SBEGestionZonesAeriennesSYSCA:Etat">
<sequence>
<xsd:element xmlns="urn:SBEGestionZonesAeriennesSYSCA-schema" xmlns:SBEGestionZonesAeriennesSYSCA="urn:SBEGestionZonesAeriennesSYSCA-schema" maxOccurs="unbounded" SCCOAMCD:attribut="A-SC.EtatEltControle.Etat" SCCOAMCD:desc="" minOccurs="1" name="etat" type="typeString"/>
</sequence>
</extension>
</complexContent>
</complexType>
<xsd:element name="balisesXrm" type="balisesXrmType"/>
<xsd:element xmlns="urn:SBEGestionZonesAeriennesSYSCA-schema"
xmlns:SBEGestionZonesAeriennesSYSCA="urn:SBEGestionZonesAeriennesSYSCA-
schema" name="SBEGestionZonesAeriennesSYSCA"
type="SBEGestionZonesAeriennesSYSCA:type_SBEGestionZonesAeriennesSYSCA"/>
</xsd:schema>
Я не понимаю, почему мой тег balisesXrm не появляется в последовательности. Однако, когда я стираю шаблон, который добавляет maxOccurs, это работает.
Когда я пытался создать только один шаблон для обоих преобразований, как это, maxOccurs появляются также вне последовательности:
<xsl:template match="xsd:element">
<xsl:element name="xsd:element">
<xsl:attribute name="name">balisesXrm</xsl:attribute>
<xsl:attribute name="type">balisesXrmType</xsl:attribute>
</xsl:element>
<xsl:copy>
<xsl:attribute name="maxOccurs">unbounded</xsl:attribute>
<xsl:attribute name="ref">attributsXrm</xsl:attribute>
<xsl:apply-templates select="node()| @*[not(name() = 'maxOccurs')]" />
</xsl:copy>
</xsl:template>
Спасибо за вашу помощь.