我希望我的XSD能夠強制執行一組元素中至少有一個元素必須存在。其中一些元素可能出現無限次,有些是有限的。至少有一個這些元素,但最多隻有一個
這些元素本身都不是強制性的,但至少有一個元素必須存在。
最後,元素可以按任意順序出現。即爲了既不應強制執行,也不對文件的處理有任何影響
我嘗試這個:
<xs:element name="Root">
<xs:complexType>
<xs:choice>
<xs:element minOccurs="0" maxOccurs="unbounded" name="A" type="a:a"/>
<xs:element minOccurs="0" maxOccurs="unbounded" name="B" type="a:a"/>
<xs:element minOccurs="0" maxOccurs="1" name="C" type="a:a"/>
<xs:element minOccurs="0" maxOccurs="1" name="D" type="a:a"/>
</xs:choice>
</xs:complexType>
</xs:element>
這並不完全工作,因爲它不執行有至少是一個的這些元素。
因此,在上面的例子中,必須有A,B,C或D. 中的至少一個可以有多個A或B的元素,但只有1各自爲C或d
的所以下面的所有應有效:
<root><A/></root>
<root><A/><A/></root>
<root><A/><B/><A/></root>
<root><C/></root>
<root><D/><C/></root>
但是下面應該是無效的:
<root/>
- 至少一個元素必須存在<root></root>
- 至少一個元素必須存在<root><C/><C/></root>
- 重複<C/>
元素
有一個額外的複雜因素,這是對現有複雜類型的擴展,但我不認爲這會影響任何東西?
這可能嗎?
我嘗試添加minOccurs =「1」到xs:choice元素。這沒有效果,大概是因爲每個選擇的實例都可以是空的!我也試過有一個xs:choice(沒有minOccurs在子項中)和一個xs:序列(沒有C & D節點)但我找不到任何父元素,它們可以共存。
哇。感謝您的非常詳細的答案。 不幸的是,我不熟悉DTD語法,但是如果我假設它有點類似於正則表達式,那麼我可以理解你在這裏有什麼。 只是爲了澄清一些事情 - 在我的例子中,元素的順序是完全不相關的。訂單不應受到限制,也不會以任何方式影響文檔的處理。父元素本質上是一個混雜的東西 – DJL
我確實考慮過用所有可能的命令複製組的想法。然而,這對於4種元素類型來說同樣困難 - 在我的現實世界中,實際上有5種元素,這種情況幾乎肯定會增加。因此這不是一個實際的解決方案 - 絕對需要更通用的東西! – DJL
是的,除了使用逗號而不是並置來描述序列之外,DTD符號類似於常規正則表達式的(的一個子集)。 –