- From: Mukul Gandhi <gandhi.mukul@gmail.com>
- Date: Sat, 22 Feb 2020 11:27:39 +0530
- To: Rajneesh Shukla <rajneeshshukla@gmail.com>
- Cc: "xmlschema-dev@w3.org" <xmlschema-dev@w3.org>
- Message-ID: <CABuuzNNCP7koKzfot3gwu61cviPEk=xFL4z9gcd4g2v8FxUvJg@mail.gmail.com>
Hi Rajneesh,
Within the XSD document you've attached, following is a XSD issue to
start with (using Xerces-J 2.12.1 as XSD validator),
[Error] query1.xsd:3:67: s4s-att-not-allowed: Attribute 'maxOccurs' cannot
appear in element 'element'.
[Error] query1.xsd:3:67: s4s-att-not-allowed: Attribute 'minOccurs' cannot
appear in element 'element'.
i.e, the following is not allowed by XSD language,
<xs:schema attributeFormDefault="unqualified"
elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="functionalView" maxOccurs="1" minOccurs="1">
...
</xs:schema>
Removing, maxOccurs="1" minOccurs="1" from above shown xs:element
declaration from your attached XSD document, makes your XSD document
correct (with both 1.0 and 1.1 versions of XSD language).
Now coming to your question.
I think that, the issue you've mentioned can be solved using an XSD 1.1
<assert> instruction. I guess that, you can rewrite your XSD fragment to
following (I've only added an <assert>), to achieve what you've mentioned,
<xs:element name="where" maxOccurs="1" minOccurs="0">
<xs:complexType>
<xs:sequence>
<xs:element name="condition" maxOccurs="unbounded"
minOccurs="1">
<xs:complexType>
<xs:simpleContent>
<xs:extension base="xs:string">
<xs:attribute type="xs:string"
name="alias1" use="required"/>
<xs:attribute type="xs:string"
name="col1" use="required"/>
<xs:attribute type="xs:string"
name="operator" use="required"/>
<xs:attribute type="xs:string"
name="string" use="optional"/>
<xs:attribute type="xs:string"
name="number" use="optional"/>
<xs:attribute type="xs:string"
name="date" use="optional"/>
<xs:assert test="exists(@string
| @number | @date)"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
I've not tested, the logic of <assert> I've mentioned above.
Could be useful information to share that, you may use the full XPath 2.0
language, to write value of 'test' attribute of an <assert>. Also, 1 upto
any number of <assert> elements can be written as siblings in the XSD
document (all of the sibling <assert> elements, have to evaluate to true
for having the XML instance document valid).
On Fri, Feb 21, 2020 at 11:16 PM Rajneesh Shukla <rajneeshshukla@gmail.com>
wrote:
> Hello All,
>
> I am new to XSD and XML and need to explore if there is option to make
> sure that any one attribute in a set of attributes within same element is
> required.
>
> Example:
>
> <xs:element name="where" maxOccurs="1" minOccurs="0">
> <xs:complexType>
> <xs:sequence>
> <xs:element name="condition" maxOccurs="unbounded"
> minOccurs="1">
> <xs:complexType>
> <xs:simpleContent>
> <xs:extension base="xs:string">
> <xs:attribute type="xs:string" name="alias1"
> use="required"/>
> <xs:attribute type="xs:string" name="col1"
> use="required"/>
> <xs:attribute type="xs:string" name="operator"
> use="required"/>
> <xs:attribute type="xs:string" name="string"
> use="optional"/>
> <xs:attribute type="xs:string" name="number"
> use="optional"/>
> <xs:attribute type="xs:string" name="date"
> use="optional"/>
> </xs:extension>
> </xs:simpleContent>
> </xs:complexType>
> </xs:element>
> </xs:sequence>
> </xs:complexType>
> </xs:element>
>
> Here I want to ensure that minimum one attribute in a set of 3
> attributes (mentioned as optional in above) are required. All can not be
> optional , however any one (can be more than one also) is required.
>
> Thanking you in anticipation !!!
>
> Attachment:
> Complete XSD file.
>
--
Regards,
Mukul Gandhi
Received on Saturday, 22 February 2020 05:58:10 UTC