xml - Repeating element after xsd:all -
i'd ask if possible allow 1 element repeated after xsd:all. this:
<xsd:complextype name="animal"> <xsd:all> <xsd:element name="name" type="nametype"/> <xsd:element name="price" type="salarytype"/> </xsd:all> <xsd:element name="note" type="xsd:string" minoccurs="0" maxoccurs="unbounded"/> </xsd:complextype> this not valid because there cannot element after xsd:all, how can achieve this?
you can't have element child of complextype. need all group inside sequence, illegal (all has top level of complex type, , can't contain groups - elements , references). all restricted want.
a solution not use all use different group , configure behaves group declared. here alternatives. can choose 1 works or experiment bit , adapt one.
1) choice element allows select 1 group. declaring choice group maxoccurs="unbounded" give similar effect, , can nest choice inside sequence obtaining expect:
<xsd:complextype name="animal"> <xsd:sequence> <xsd:choice maxoccurs="unbounded"> <xsd:element name="name" type="xsd:string"/> <xsd:element name="price" type="xsd:string"/> </xsd:choice> <xsd:element name="note" type="xsd:string" minoccurs="0" maxoccurs="unbounded"/> </xsd:sequence> </xsd:complextype> only 1 element selected choice, since can have many choice groups, effect allow have many elements in order. it's not 100% equivalent all though: since there no minoccurs need have @ least 1 price or 1 name, doesn't required both. valid:
<price></price> <name></name> <name></name> <name></name> <price></price> <name></name> <price></price> <price></price> <note></note> <note></note> <note></note> and this:
<price></price> <name></name> but this:
<price></price> and fail if there nothing or note.
2) if need guarantee both present pair, need sequence:
<xsd:sequence> <xsd:sequence maxoccurs="unbounded"> <xsd:element name="name" type="xsd:string"/> <xsd:element name="price" type="xsd:string"/> </xsd:sequence> <xsd:element name="note" type="xsd:string" minoccurs="0" maxoccurs="unbounded"/> </xsd:sequence> this make validation fail if price or name present, fail if price comes before name because enforces order.
3) if want allow name/price pair in any order, can declare choice containing 2 sequences:
<xsd:complextype name="animal"> <xsd:sequence> <xsd:choice maxoccurs="unbounded"> <xsd:sequence> <xsd:element name="name" type="xsd:string"/> <xsd:element name="price" type="xsd:string"/> </xsd:sequence> <xsd:sequence> <xsd:element name="price" type="xsd:string"/> <xsd:element name="name" type="xsd:string"/> </xsd:sequence> </xsd:choice> <xsd:element name="note" type="xsd:string" minoccurs="0" maxoccurs="unbounded"/> </xsd:sequence> </xsd:complextype> but allow name/price pairs in order. still can't have:
<price/> <price/> <name/> 4) if wan't allow names , prices in order, allow unbalanced pairs, , no names or prices, or empty animal, use this:
<xsd:element name="animal" type="animal" /> <xsd:complextype name="animal"> <xsd:sequence> <xsd:sequence maxoccurs="unbounded" minoccurs="0"> <xsd:element name="name" type="xsd:string"/> <xsd:element name="price" type="xsd:string"/> </xsd:sequence> <xsd:sequence maxoccurs="unbounded" minoccurs="0"> <xsd:element name="price" type="xsd:string"/> <xsd:element name="name" type="xsd:string"/> </xsd:sequence> <xsd:element name="note" type="xsd:string" minoccurs="0" maxoccurs="unbounded"/> </xsd:sequence> </xsd:complextype> none of these same all but, depending on needs, 1 of them or combination might fit needs.
Comments
Post a Comment