2016-02-29 38 views
1

我想驗證XML如下所示。我有3個元素name,age,address必須按該順序聲明(因此序列標籤)。然而,工作元素應該被允許在任何地方顯示(即:在這個元素序列之前或之後)。這可能使用XSD驗證嗎?目前我只能接受它被添加到這些元素之後,因爲這是它在順序中的位置。我也試過混合xs:choicexs:sequence但沒有成功。如何在驗證XML時正確使用序列標籤?

<xs:complexType name="PersonNode"> 
    <xs:sequence> 
     <xs:element name="name" type="tns:StringLabel"/> 
     <xs:element name="age" type="xs:string"/> 
     <xs:element name="address" type="xs:string"/> 
     <xs:element name="job" type="xs:string" minOccurs="0"/> 
    </xs:sequence> 
    <xs:attribute name="valid" type="xs:boolean"/> 
</xs:complexType> 

回答

2

只要job不必是可選的,你可以使用xs:choice來達到您想要的約束如下:

<xs:complexType name="PersonNode"> 
    <xs:choice> 
     <xs:sequence> 
     <xs:element name="name" type="tns:StringLabel"/> 
     <xs:element name="age" type="xs:string"/> 
     <xs:element name="address" type="xs:string"/> 
     <xs:element name="job" type="xs:string"/> 
     </xs:sequence> 
     <xs:sequence> 
     <xs:element name="job" type="xs:string"/> 
     <xs:element name="name" type="tns:StringLabel"/> 
     <xs:element name="age" type="xs:string"/> 
     <xs:element name="address" type="xs:string"/> 
     </xs:sequence> 
    </xs:choice> 
    <xs:attribute name="valid" type="xs:boolean"/> 
    </xs:complexType> 

然而,這種假設job需要在一個地方或另一個;否則,這將與唯一粒子歸因相抵觸。 [更新:請不要錯過C. M. Sperberg-McQueen的意見,允許job爲可選項。它巧妙地擺脫了UPA,將第二種選擇專門用於領先的job箱子,同時讓第一種選擇涵蓋了no job和尾隨job箱子。]

所有考慮的事情,我會建議你去你原來的方法,並放棄要求job被允許出現在PersonNode的內容模型的兩個不同的地方。我無法告訴你有多少次我看到人們爲了純粹理論上的關注而允許元素無序化而掙扎,這隻會使實踐中的事情複雜化。

+1

爲了讓'job'在這裏可選,而不會留下眼淚或咬牙切齒,可以在內容模型中首次出現'job'的地方添加'minOccurs =「0」',而不是另一個。但最好遵循這裏給出的建議:除非「工作」的位置傳達一些具體信息,否則將其分配給一個固定的位置。 –

+0

@ C.M.Sperberg-McQueen:太棒了! – kjhughes

相關問題