[英]XSD validation in a sequence and choice
我看了很多帖子卻找不到答案...
我有一個XSD來驗證我的XML,但是遇到一些問題。
這是我的XSD(的一部分)
<xsd:group name="Element">
<xsd:sequence>
<xsd:choice>
<xsd:element ref="El1" />
<xsd:element ref="El2" />
</xsd:choice>
</xsd:sequence>
</xsd:group>
<xsd:element name="Tree">
<xsd:complexType>
<xsd:sequence>
<xsd:element ref="El3" minOccurs="0" maxOccurs="1" />
<xsd:group ref="Element" minOccurs="0" maxOccurs="unbounded" />
</xsd:sequence>
</xsd:complexType>
</xsd:element>
它工作正常,但這並不是我想要做的全部。 我想要一個更像這樣的模式:
<xsd:element name="Tree">
<xsd:complexType>
<xsd:sequence>
<xsd:group ref="Element" minOccurs="0" maxOccurs="unbounded" />
<xsd:element ref="El3" minOccurs="0" maxOccurs="1" />
<xsd:group ref="Element" minOccurs="0" maxOccurs="unbounded" />
</xsd:sequence>
</xsd:complexType>
</xsd:element>
但是這種模式是錯誤的。
我想要的是未排序的El1或El2列表,以及一個(只有一個)El3。
謝謝你的建議 !
我想要的是未排序的El1或El2列表,以及一個(只有一個)El3。
我讀為
(e1 | e2)*(e3,(e1 | e2)*)?
那是
sequence
choice max=unbounded
E1
E2
/choice
sequence min=0
E3
choice max=unbounded
E1
E2
/choice
/sequence
/sequence
您已經遇到了XSD的“唯一粒子歸因”陷阱(對應於XML DTD的“確定性”陷阱和SGML DTD的“非歧義”陷阱)。 XSD不會接受您的內容模型,因為當遇到一個元素El1的實例作為Tree元素的第一個子元素時,如果不先行就無法知道它是否與對組Element的第一個引用相匹配或與第二個元素相匹配。 (不要問為什么負責任的工作組中的任何人都認為這很重要;這是一個乏味而令人沮喪的故事。)
因此,您需要在聲明中稍作改動:
<xsd:element name="Tree">
<xsd:complexType>
<xsd:sequence>
<xsd:group ref="Element"
minOccurs="0" maxOccurs="unbounded" />
<xsd:sequence minOccurs="0" maxOccurs="1">
<xsd:element ref="El3"/>
<xsd:group ref="Element"
minOccurs="0" maxOccurs="unbounded" />
<xsd:sequence>
</xsd:sequence>
</xsd:complexType>
多虧了CM Sperberg-McQueen,我在第二個順序周圍用了一個選擇指示器來稍微修改您的建議:
<xsd:element name="Tree">
<xsd:complexType>
<xsd:sequence>
<xsd:group ref="Element" minOccurs="0" maxOccurs="unbounded" />
<xsd:choice minOccurs="0">
<xsd:sequence minOccurs="0">
<xsd:element ref="El3"/>
<xsd:group ref="Element" minOccurs="0" maxOccurs="unbounded" />
<xsd:element ref="El4" minOccurs="0"/>
</xsd:sequence>
<xsd:element ref="El4"/>
</xsd:choice>
</xsd:sequence>
</xsd:complexType>
因為我還有第四個元素的“唯一粒子歸因”錯誤。
再次感謝 !
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.