2 votes

Restreindre le complexType avec des attributs dans le XSD ?

Je travaille avec un XSD tel que :

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" 
           elementFormDefault="qualified">
  <xs:element name="algo">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="nota" type="t_algo" minOccurs="0"
                    maxOccurs="unbounded"/>
      </xs:sequence>
    </xs:complexType>
  </xs:element>

  <xs:complexType name="t_algo">
    <xs:restriction base="xs:string">
      <xs:pattern value="[1][0]|[0-9]" />
    </xs:restriction>
    <xs:attribute name="modul" type="t_modul"/>
  </xs:complexType>

  <xs:simpleType name="t_modul">
    <xs:restriction base="xs:string">
      <xs:pattern value="[m][0][0-9]"/>
    </xs:restriction> 
  </xs:simpleType> 

</xs:schema>

et en utilisant un test XML comme celui-ci :

<?xml version="1.0" encoding="UTF-8"?>
<algo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
      xsi:noNamespaceSchemaLocation="file:///D:/DAM/RECUF1/Mispruebas/telf.xsd">
  <nota modul="m01">0</nota>
  <nota modul="m01">7</nota>
  <nota modul="m01">3</nota>
  <nota modul="m01">1</nota>
</algo>

Je veux avoir des enfants nota avec des valeurs comprises entre 0 et 10 et avec l'attribut modul avec une valeur m0X donde x entre (0-9). Je pensais que le XSD précédent fonctionnerait, mais ce n'est pas le cas. Quelqu'un peut-il m'expliquer ce que je fais mal ?

2voto

kjhughes Points 5581

Afin de disposer d'un attribut sur un élément au contenu restreint, définissez un nouvel attribut de type xs:simpleType et ensuite utiliser xs:extension pour l'étendre avec un attribut :

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" 
           elementFormDefault="qualified">

  <xs:element name="algo">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="nota" type="t_algo" minOccurs="0" maxOccurs="unbounded"/>
      </xs:sequence>
    </xs:complexType>
  </xs:element>

  <xs:complexType name="t_algo">
    <xs:simpleContent>
      <xs:extension base="t_algo_content">
        <xs:attribute name="modul" type="t_modul"/>
      </xs:extension>
    </xs:simpleContent>
  </xs:complexType>

  <xs:simpleType name="t_modul">
    <xs:restriction base="xs:string">
      <xs:pattern value="m0[0-9]"/>
    </xs:restriction> 
  </xs:simpleType> 

  <xs:simpleType name="t_algo_content">
    <xs:restriction base="xs:integer">
      <xs:minInclusive value="0"/>
      <xs:maxInclusive value="10"/>
    </xs:restriction>
  </xs:simpleType>

</xs:schema>

Notez également que j'ai simplifié votre modèle de regex dans le premier cas et utilisé minInclusive / maxInclusive pour exprimer plus naturellement votre gamme d'entiers dans le second cas.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X