от xsd до xsd: почему я не могу добавить свой тег "balisesXrm" ко всем моим элементам xsd:? - PullRequest
0 голосов
/ 02 июля 2018

Я новый пользователь 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>

Спасибо за вашу помощь.

1 Ответ

0 голосов
/ 03 июля 2018

Я понял! Я попробовал это, и это работает:

  <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>

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...