簡體   English   中英

XSD驗證的順序和選擇

[英]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.

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