- From: Loren Cahlander <loren.cahlander@gmail.com>
- Date: Mon, 24 Feb 2020 10:50:45 -0500
- To: Rajneesh Shukla <rajneeshshukla@gmail.com>
- Cc: Loren Cahlander <loren.cahlander@gmail.com>, Mukul Gandhi <gandhi.mukul@gmail.com>, "xmlschema-dev@w3.org" <xmlschema-dev@w3.org>
- Message-Id: <CA3BA671-001B-44C2-B465-652D85B095CE@gmail.com>
Take a look at the following: <?xml version="1.0" encoding="UTF-8"?> <sch:schema xmlns:sch="http://www.ascc.net/xml/schematron"> <sch:pattern name="Check structure"> <sch:rule context="Person"> <sch:assert test="@Title">The element Person must have a Title attribute</sch:assert> <sch:assert test="count(*) = 2 and count(Name) = 1 and count(Gender) = 1">The element Person should have the child elements Name and Gender.</sch:assert> <sch:assert test="*[1] = Name">The element Name must appear before element Gender.</sch:assert> </sch:rule> </sch:pattern> <sch:pattern name="Check co-occurrence constraints"> <sch:rule context="Person"> <sch:assert test="(@Title = 'Mr' and Gender = 'Male') or @Title != 'Mr'">If the Title is "Mr" then the gender of the person must be "Male".</sch:assert> </sch:rule> </sch:pattern> </sch:schema> You will see that it does have constraints based on values. Take a look at the article that I linked to. It talks about those rules. > On Feb 24, 2020, at 10:36 AM, Rajneesh Shukla <rajneeshshukla@gmail.com> wrote: > > Thanks Loren, > > One more expert advice 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> > > > Below is respective XSD for reference: > > > <?xml version="1.0" encoding="UTF-8"?> > > <xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema <http://www.w3.org/2001/XMLSchema>"> > > <xs:element name="functionalView" > > > <xs:complexType> > > <xs:sequence> > > <xs:element name="columns"> > > <xs:complexType> > > <xs:sequence> > > <xs:element name="column" maxOccurs="unbounded" minOccurs="1"> > > <xs:complexType> > > <xs:simpleContent> > > <xs:extension base="xs:string"> > > <xs:attribute type="xs:string" name="name" use="required"/> > > <xs:attribute type="xs:string" name="columnAlias" use="required"/> > > <xs:attribute type="xs:string" name="description" use="required"/> > > </xs:extension> > > </xs:simpleContent> > > </xs:complexType> > > </xs:element> > > </xs:sequence> > > </xs:complexType> > > </xs:element> > > <xs:element name="fromviews" maxOccurs="1" minOccurs="1"> > > <xs:complexType> > > <xs:sequence> > > <xs:element name="fromview" maxOccurs="unbounded" minOccurs="2"> > > <xs:complexType> > > <xs:simpleContent> > > <xs:extension base="xs:string"> > > <xs:attribute type="xs:string" name="name" use="required"/> > > <xs:attribute type="xs:string" name="alias" use="required"/> > > </xs:extension> > > </xs:simpleContent> > > </xs:complexType> > > </xs:element> > > </xs:sequence> > > </xs:complexType> > > </xs:element> > > <xs:element name="joins" maxOccurs="1" minOccurs="1"> > > <xs:complexType> > > <xs:choice maxOccurs="unbounded" minOccurs="1"> > > <xs:element name="join" maxOccurs="unbounded" minOccurs="0"> > > <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="condition" use="required"/> > > <xs:attribute type="xs:string" name="alias2" use="required"/> > > <xs:attribute type="xs:string" name="col2" use="required"/> > > </xs:extension> > > </xs:simpleContent> > > </xs:complexType> > > </xs:element> > > <xs:element name="leftouterjoin" maxOccurs="unbounded" minOccurs="0"> > > <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="condition" use="required"/> > > <xs:attribute type="xs:string" name="alias2" use="required"/> > > <xs:attribute type="xs:string" name="col2" use="required"/> > > </xs:extension> > > </xs:simpleContent> > > </xs:complexType> > > </xs:element> > > </xs:choice> > > </xs:complexType> > > </xs:element> > > <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> > > </xs:sequence> > > <xs:attribute type="xs:string" name="name"/> > > <xs:attribute type="xs:string" name="description"/> > > </xs:complexType> > > </xs:element> > > </xs:schema> > > > > Thanks, > > Rajneesh > > > On Mon, 24 Feb 2020 at 20:57, Loren Cahlander <loren.cahlander@gmail.com <mailto:loren.cahlander@gmail.com>> wrote: > 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 <mailto: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:51:05 UTC