W3C home > Mailing lists > Public > xmlschema-dev@w3.org > February 2020

Re: XSD with "required" attribute option related query

From: Mukul Gandhi <gandhi.mukul@gmail.com>
Date: Sat, 22 Feb 2020 11:27:39 +0530
Message-ID: <CABuuzNNCP7koKzfot3gwu61cviPEk=xFL4z9gcd4g2v8FxUvJg@mail.gmail.com>
To: Rajneesh Shukla <rajneeshshukla@gmail.com>
Cc: "xmlschema-dev@w3.org" <xmlschema-dev@w3.org>
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

This archive was generated by hypermail 2.4.0 : Saturday, 22 February 2020 05:58:11 UTC