[
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>
>
|