簡體   English   中英

XSD:以任何順序允許任何未知元素

[英]XSD: Allow any unknown element in any order

我需要編寫一個XSD架構。 在此架構中,一些元素是已知的和強制性的,其他元素是未知的和可選的:

<father>
    <childMandatory1 />
    <childMandatory2 />
    <childOptionnal1 />
</father>

或:(更改兒童的強制性命令)

<father>
    <childMandatory2 />
    <childMandatory1 />
</father>

我知道強制孩子(但不知道他們的命令)。 但是我不知道是否會有可選的孩子(如果有的話,他們的名字)。

我嘗試使用“ xs:all”,但是“ xs:all”不允許“ any”:

<xs:element name="father">
        <xs:complexType>
            <xs:all>
                <xs:element ref="childMandatory1" />
                <xs:element ref="childMandatory2" />
                <xs:any minOccurs="0" maxOccurs="unbounded" processContents="lax"/> 
        <!-- error here ! -->
                </xs:all>
            </xs:complexType>
    </xs:element>

我嘗試了序列,但是我應該知道元素的順序。 (我沒有)

我嘗試了choice,但是choice無法使用任何強制性元素。 (並且我想確保存在強制性元素)

根據您的要求,您已達到“唯一粒子歸因”規則,該規則非常重要,因為它具有自己的Wikipedia頁面

問題在於將任何順序任何元素組合在任何地方 處理器無法確定性地確定某個元素所屬的聲明。 childMandatory1屬於xs:any還是屬於元素聲明?

只要使用xs:any您就可以輕松遇到此問題。 這就是為什么允許序列與xs:any組合的原因,但xs:any是該序列中的各項是強制性的和有序的,否則,就不會再說出哪個元素屬於什么聲明了。

如果創建此類XSD的原因是要驗證輸入中是否存在某些元素,則可以切換到XSD 1.1,在其中可以使用xs:assert解決此問題,也可以使用其他工具(例如RelaxNg或Schematron)來執行此操作是替代的標准化XML模式語言。

如果要以此創建對象模型,可能會運氣不佳,因為即使您設法做到這一點,(de)序列化器也無法相互告知聲明。

這是XSD 1.1中的示例:

<xs:complexType name="BookType">
    <xs:all>
        <xs:any maxOccurs="unbounded" namespace="##any" />
    </xs:all>
    <xs:assert test="self::author | self::title | self:isbn" xpathDefaultNamespace="urn:test" />
</xs:complexType>

在XFront上可以找到有關使用可變內容容器編寫可擴展XSD Schema的有用且有益的文章。 雖然年代久遠,但今天仍然非常適用。 還有一篇有關xs:any的使用文章

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM