J
John Carron
Hi All,
I have written a simple schema (see below) that uses substitution
groups. I don't know if this the correct usage because I'm fairly new to
xml schema.
The structure is as follows:
Request
Report
TargetReference (reference identifier attribute)
Target (identifier attribute)
Example Document:
<?xml version="1.0" encoding="UTF-8"?>
<Request xmlns="urn:demo"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="urn:demo
Untitled23.xsd">
<DummyReport identifier="10">
<TargetReference identifier="20"/>
</DummyReport>
<DummyTarget identifier="20"/>
</Request>
A valid document can contain a number of reports and targets. The target
reference element should reference only targets in the document and I would
like to enforce this. Does anybody know how to do this? I was initially
thinking along the lines of using the Key and KeyRef elements but don't know
how to do that with substitution groups? Is it possible? I would also like
to enforce that all target identifier attributes are unique. Can this be
done?
Any help would be appreciated.
Regards
Darren
2) Send newsgroup message:
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns="urn:demo" xmlns:xs="http://www.w3.org/2001/XMLSchema"
targetNamespace="urn:demo" elementFormDefault="qualified"
attributeFormDefault="unqualified">
<!-- Root element request -->
<xs:element name="Request">
<xs:complexType>
<xs:sequence>
<xs:element ref="ReportGroup"
maxOccurs="unbounded"/>
<xs:element ref="TargetGroup"
maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<!-- Abstract report type -->
<xs:complexType name="Report" abstract="true">
<xs:sequence>
<xs:element ref="TargetReference"
maxOccurs="unbounded"/>
</xs:sequence>
<xs:attribute name="identifier" type="xs:int"
use="required"/>
</xs:complexType>
<!-- Abstract target type -->
<xs:complexType name="Target" abstract="true">
<xs:attribute name="identifier" type="xs:int"
use="required"/>
</xs:complexType>
<xs:element name="ReportGroup" type="Report" abstract="true"/>
<xs:element name="TargetGroup" type="Target" abstract="true"/>
<!-- Element to join a report to a target -->
<xs:element name="TargetReference">
<xs:complexType>
<xs:attribute name="identifier" type="xs:int"
use="required"/>
</xs:complexType>
</xs:element>
<!-- Reports -->
<xs:element name="DummyReport" substitutionGroup="ReportGroup">
<xs:complexType>
<xs:complexContent>
<xs:extension base="Report"/>
</xs:complexContent>
</xs:complexType>
</xs:element>
<xs:element name="AnotherDummyReport"
substitutionGroup="ReportGroup">
<xs:complexType>
<xs:complexContent>
<xs:extension base="Report"/>
</xs:complexContent>
</xs:complexType>
</xs:element>
<!-- Targets -->
<xs:element name="DummyTarget" substitutionGroup="TargetGroup">
<xs:complexType>
<xs:complexContent>
<xs:extension base="Target"/>
</xs:complexContent>
</xs:complexType>
</xs:element>
<xs:element name="DummyTarget2" substitutionGroup="TargetGroup">
<xs:complexType>
<xs:complexContent>
<xs:extension base="Target"/>
</xs:complexContent>
</xs:complexType>
</xs:element>
</xs:schema>
I have written a simple schema (see below) that uses substitution
groups. I don't know if this the correct usage because I'm fairly new to
xml schema.
The structure is as follows:
Request
Report
TargetReference (reference identifier attribute)
Target (identifier attribute)
Example Document:
<?xml version="1.0" encoding="UTF-8"?>
<Request xmlns="urn:demo"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="urn:demo
Untitled23.xsd">
<DummyReport identifier="10">
<TargetReference identifier="20"/>
</DummyReport>
<DummyTarget identifier="20"/>
</Request>
A valid document can contain a number of reports and targets. The target
reference element should reference only targets in the document and I would
like to enforce this. Does anybody know how to do this? I was initially
thinking along the lines of using the Key and KeyRef elements but don't know
how to do that with substitution groups? Is it possible? I would also like
to enforce that all target identifier attributes are unique. Can this be
done?
Any help would be appreciated.
Regards
Darren
2) Send newsgroup message:
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns="urn:demo" xmlns:xs="http://www.w3.org/2001/XMLSchema"
targetNamespace="urn:demo" elementFormDefault="qualified"
attributeFormDefault="unqualified">
<!-- Root element request -->
<xs:element name="Request">
<xs:complexType>
<xs:sequence>
<xs:element ref="ReportGroup"
maxOccurs="unbounded"/>
<xs:element ref="TargetGroup"
maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<!-- Abstract report type -->
<xs:complexType name="Report" abstract="true">
<xs:sequence>
<xs:element ref="TargetReference"
maxOccurs="unbounded"/>
</xs:sequence>
<xs:attribute name="identifier" type="xs:int"
use="required"/>
</xs:complexType>
<!-- Abstract target type -->
<xs:complexType name="Target" abstract="true">
<xs:attribute name="identifier" type="xs:int"
use="required"/>
</xs:complexType>
<xs:element name="ReportGroup" type="Report" abstract="true"/>
<xs:element name="TargetGroup" type="Target" abstract="true"/>
<!-- Element to join a report to a target -->
<xs:element name="TargetReference">
<xs:complexType>
<xs:attribute name="identifier" type="xs:int"
use="required"/>
</xs:complexType>
</xs:element>
<!-- Reports -->
<xs:element name="DummyReport" substitutionGroup="ReportGroup">
<xs:complexType>
<xs:complexContent>
<xs:extension base="Report"/>
</xs:complexContent>
</xs:complexType>
</xs:element>
<xs:element name="AnotherDummyReport"
substitutionGroup="ReportGroup">
<xs:complexType>
<xs:complexContent>
<xs:extension base="Report"/>
</xs:complexContent>
</xs:complexType>
</xs:element>
<!-- Targets -->
<xs:element name="DummyTarget" substitutionGroup="TargetGroup">
<xs:complexType>
<xs:complexContent>
<xs:extension base="Target"/>
</xs:complexContent>
</xs:complexType>
</xs:element>
<xs:element name="DummyTarget2" substitutionGroup="TargetGroup">
<xs:complexType>
<xs:complexContent>
<xs:extension base="Target"/>
</xs:complexContent>
</xs:complexType>
</xs:element>
</xs:schema>