I'm working with an XSD such as:
<?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>
and using a test XML like this:
<?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>
I want to have children nota
with values between 0-10 and with the attribute modul
with a value m0X
where x
between (0-9). I thought the previous XSD would work, but it does not. Can somebody explain me what I'm doing wrong?
In order to have an attribute on an element with restricted content, define a new xs:simpleType
and then use xs:extension
to extend it with an attribute:
<?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>
Note also that I've simplified your regex pattern in the first case and used minInclusive
/maxInclusive
to more naturally express your integer range in the second case.
来源:https://stackoverflow.com/questions/37738422/restrict-complextype-with-attributes-in-xsd