Re: XSD with "required" attribute option related query

If you cannot use XSD 1.1, then I would recommend that you utilize Schematron.

https://www.xml.com/pub/a/2003/11/12/schematron.html <https://www.xml.com/pub/a/2003/11/12/schematron.html>

> On Feb 24, 2020, at 10:00 AM, Rajneesh Shukla <rajneeshshukla@gmail.com> wrote:
> 
> Hi Mukul,
> 
> One more help please:
> 
> Is it possible to impose required constraint at value level?
> for example in below xml, I wnt to make sure value for alias1, coli1 and operator is always populated in condition element within where element.
> 
> functionalView name="CLAIMS_FV"  description="Learning Purpose">
> 
>   <columns>
> 
>     <column name="CLAI.CODE"   columnAlias="CODE"  description="The code of the claim" />
> 
>     <column name="CLLI.CODE"   columnAlias="LINE_CODE"  description="The code of the claim line" />
> 
>     <column name="PROC.CODE"   columnAlias="PROC_CODE"  description="The code of the claim line procedure" />
> 
>   </columns>
> 
>   <fromviews>
> 
>     <fromview name="CLAIMS_V" alias="CLAI" />
> 
>     <fromview name="LINES_V" alias="CLLI" />
> 
>     <fromview name="PROC_V" alias="PROC" />
> 
>     <fromview name="PROV_V" alias="PROV" />
> 
>     <fromview name="FORMS_V" alias="CLFO"/>
> 
>     <fromview name="FORMTYPES_V" alias="CFTY"/>
> 
>   </fromviews>
> 
>   <joins>
> 
>     <join  alias1="CLLI" col1="CLAI_ID" condition="="  alias2="CLAI" col2="ID"/>
> 
>     <join  alias1="CLFO" col1="ID" condition="="  alias2="CFTY" col2="CLFO_ID"/>
> 
>     <join  alias1="CFTY" col1="ID" condition="="  alias2="PROC" col2="CFTY_ID"/>
> 
>     <leftouterjoin  alias1="PROV" col1="ID" condition="="  alias2="CLAI" col2="PROVIDER_ID"/>
> 
>   </joins>
> 
>   <where>
> 
>     <condition alias1="CFTY" col1="CODE"  operator="="  string=""   number="" date= ""    />
> 
>   </where>
> 
> </functionalView>
> 
> Thanks,
> Rajneesh
> 
> On Mon, 24 Feb 2020 at 13:39, Rajneesh Shukla <rajneeshshukla@gmail.com <mailto:rajneeshshukla@gmail.com>> wrote:
> Hi Mukul,
> 
> Thanks for your reply.
> I am  working inside the database, it won't be possible.
> 
> Oracle XML DB only supports XML Schema 1.0.
> 
> 
> 
> Thanks,
> 
> Rajneesh
> 
> 
> On Sat, 22 Feb 2020 at 11:27, Mukul Gandhi <gandhi.mukul@gmail.com <mailto:gandhi.mukul@gmail.com>> wrote:
> 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 <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 <mailto: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 Monday, 24 February 2020 15:28:02 UTC