Понимание xsd: выбор и minOccurs
У меня возникли проблемы с пониманием поведения следующей XML-схемы:
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsd:element name="rootnode">
<xsd:complexType>
<xsd:sequence>
<xsd:choice minOccurs="1" maxOccurs="2">
<xsd:element name="e1" minOccurs="1" maxOccurs="2"/>
<xsd:element name="e2" minOccurs="0" maxOccurs="1"/>
</xsd:choice>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:schema>
Я ожидал, что в качестве дочернего элемента <rootnode>
требуется хотя бы один экземпляр любого элемента <e1>
или <e2>
. Несмотря на мои ожидания, пустой <rootnode>
будет проверять эту схему:
> xmllint --schema test.xsd empty.xml
<?xml version="1.0" encoding="UTF-8"?>
<rootnode>
</rootnode>
empty.xml validates
Если я изменяю атрибут minOccurs
элемента e2
на нечто, отличное от "0"
, я получаю поведение, которое я изначально ожидал.
-
Кажется, что простое отсутствие элемента <e2>
считается как пример xsd:choice
в моем примере.
-
Если это так, то как это бесконечное количество вхождений не нарушает предел maxOccurs
в моем xsd:choice
?
Ответы
Ответ 1
Я говорю вам, что вы можете ходить в магазины хотя бы раз и не чаще двух раз, и каждый раз, когда у вас есть выбор, что купить: вы можете купить яблоки (одно яблоко или два яблока), или вы можете купить апельсины (ни апельсины, ни один апельсин).
Вполне возможно, что вы решите пойти в магазины дважды и каждый раз покупать не апельсины. Итак, вы ничего не возвращаетесь.
Ответ 2
Вот допустимые комбинации
Two choices:
e1 (1 - 2) + e1 (1 - 2) = e1 x (2 - 4), or
e1 (1 - 2) + e2 (0 - 1), or
e2 (0 - 1) + e1 (1 - 2), or
e2 (0 - 1) + e2 (0 - 1) = e2 (0 - 2)
One choice (but no new outcomes):
e1 (1-2), or
e2 (0-1)
e1e1, e1e1e1, e1e1e1e1
e1, e1e2, e1e1e2
e2e1, e2e1e1
empty, e2, e2e2
Обратите внимание, что выбор [min = 2 max = 2] создал бы тот же набор допустимых комбинаций.