问题
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?
回答1:
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