OASIS Mailing List ArchivesView the OASIS mailing list archive below
or browse/search using MarkMail.

 


Help: OASIS Mailing Lists Help | MarkMail Help

 


 

   Re: [xml-dev] XPath question with regards to Schematron rule

[ Lists Home | Date Index | Thread Index ]

Hi Paul,

You can do that with something like:

<xs:annotation>
   <xs:appinfo>
     <sch:pattern name="Check references.">
       <sch:rule context="F">
         <sch:assert 
test="count(G)=../../D[@name=current()/@ref]/@num">Number of G elements 
should match the refered D num
           attribute value.</sch:assert>
       </sch:rule>
     </sch:pattern>
   </xs:appinfo>
</xs:annotation>

A possible complete schema (generated with Trang from the instance 
document and annotated with Schematron) can look like:

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"; 
elementFormDefault="qualified"
   xmlns:sch="http://www.ascc.net/xml/schematron";>
   <xs:annotation>
     <xs:appinfo>
       <sch:title>Test schematron schema</sch:title>
     </xs:appinfo>
   </xs:annotation>
   <xs:element name="A">
     <xs:complexType>
       <xs:sequence>
         <xs:element ref="B"/>
         <xs:element ref="C"/>
       </xs:sequence>
     </xs:complexType>
   </xs:element>
   <xs:element name="B">
     <xs:complexType/>
   </xs:element>
   <xs:element name="C">
     <xs:complexType>
       <xs:sequence>
         <xs:element ref="D"/>
         <xs:element ref="E"/>
       </xs:sequence>
     </xs:complexType>
   </xs:element>
   <xs:element name="D">
     <xs:complexType>
       <xs:attribute name="name" use="required" type="xs:NCName"/>
       <xs:attribute name="num" use="required" type="xs:integer"/>
     </xs:complexType>
   </xs:element>
   <xs:element name="E">
     <xs:complexType>
       <xs:sequence>
         <xs:element maxOccurs="unbounded" ref="F"/>
       </xs:sequence>
     </xs:complexType>
   </xs:element>
   <xs:element name="F">
     <xs:annotation>
       <xs:appinfo>
         <sch:pattern name="Check references.">
           <sch:rule context="F">
             <sch:assert 
test="count(G)=../../D[@name=current()/@ref]/@num">Number of G elements 
should match the refered D num
               attribute value.</sch:assert>
           </sch:rule>
         </sch:pattern>
       </xs:appinfo>
     </xs:annotation>
     <xs:complexType>
       <xs:sequence>
         <xs:element maxOccurs="unbounded" ref="G"/>
       </xs:sequence>
       <xs:attribute name="name" use="required" type="xs:NCName"/>
       <xs:attribute name="ref" use="required" type="xs:NCName"/>
     </xs:complexType>
   </xs:element>
   <xs:element name="G">
     <xs:complexType/>
   </xs:element>
</xs:schema>

Hope that helps,
George
---------------------------------------------------------------------
George Cristian Bina
<oXygen/> XML Editor, Schema Editor and XSLT Editor/Debugger
http://www.oxygenxml.com


Paul Popiel wrote:
> Hi,
> 
> If i have a XML stucture like so:
> 
> <A>
>   <B>
>   </B>
>   <C>
>     <D name=test num=3>
>     </D>
>     <E>
>        <F name=one ref=test>
>            <G></G>
>            <G></G>
>            <G></G>
>        </F>
>        <F name=two ref=test>
>            <G></G>
>            <G></G>
>        </F>
> </A>
> 
> 
> how can i write a schematron rule to test that each <F> element has the
> right number of <G> elements in it with respect to the value of the num
> attribute in the <D> element with the same name as that of the <F> elements
> ref attribute.
> 
> so with respect to the above example <F> elements one and two both have ref
> "pointing" to element <D> test, where num=3
> so both <F> elements should have 3 <G> elements
> 
> so in this case <F> two should signal an error when the schematron rule is
> run.
> 
> 
> In terms of the schematron rule:
> 
> 				<sch:pattern name="Correct number of G in
> F.">
> 					<sch:rule context="/">
> 						<sch:assert
> test="????">Incorrect number of G.</sch:assert>
> 					</sch:rule>
> 				</sch:pattern>
> 
> what would be in the test attribute?
> 
> also i would like to work with absolute paths if possible.
> 
> ive tried all sorts of things using //F[count(G) = etc etc but i just cant
> seem to get something working.
> 
> any help would be greatly appreciated
> 
> thanks
> 
> Paul Popiel
> Software Engineer
> 
> Advanced Engine Components Limited
> 14 Energy St, Malaga WA 6090
> Fax: +61 8 9209 6999
> Mob: 0412 657 051
> mailto:paulp@advancedengine.com
> http://www.advancedengine.com
> 
> 
> 
> **********************************************************************
> This email is confidential.  If you are not the intended recipient, 
> you must not copy, distribute, disclose or otherwise use the 
> information contained in it.   If you have received this email in 
> error, please tell us immediately by return email or by contacting 
> us on (+61 8) 9209 6900 and delete the document.  Email may 
> be susceptible to data corruption, interception and unauthorised 
> amendment.  Advanced Engine Components Ltd is not 
> responsible for any changes made to a document other than 
> those made by Advanced Engine Components Ltd, or for the 
> effect of the changes on the document's meaning.
> 
> You must scan this email and any attachments for viruses. 
> Advanced Engine Components Ltd accepts no liability for any 
> loss, damage or consequence, whether caused by our own 
> negligence or not, resulting directly or indirectly from your 
> receipt of this email or the use of any attachments.
> **********************************************************************
> 
> -----------------------------------------------------------------
> The xml-dev list is sponsored by XML.org <http://www.xml.org>, an
> initiative of OASIS <http://www.oasis-open.org>
> 
> The list archives are at http://lists.xml.org/archives/xml-dev/
> 
> To subscribe or unsubscribe from this list use the subscription
> manager: <http://www.oasis-open.org/mlmanage/index.php>
> 




 

News | XML in Industry | Calendar | XML Registry
Marketplace | Resources | MyXML.org | Sponsors | Privacy Statement

Copyright 2001 XML.org. This site is hosted by OASIS