|
[XML-DEV Mailing List Archive Home] [By Thread] [By Date] [Recent Entries] [Reply To This Message] Re: schema key/keyRef question - matching multiple keys
I wanted to follow up with a full solution to the subID/license plate
problem (albeit a more redundant solution than I was hoping for - oh well).
Below is sample xml and an xsd. The xsd has a number of uniques and
key/keyRef pairs that should prevent incorrect sub id matchings.
Seems like people on this list are certainly aware of this solution -
but, figured I'd just finish off the thread.
zip here containing both files...
http://www.visual-io.com/dougXsdSample/xsdSubIDsExample.zip
cheers,
doug
XML...
<subIDsForProjects xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="subIDs.xsd">
<meta>
<var name="String" vID="1">
<buckets>
<bucket bID="1" name="High" vID="1"/>
<bucket bID="2" name="Medium" vID="1"/>
<bucket bID="3" name="Low" vID="1"/>
</buckets>
</var>
<var name="String" vID="2">
<buckets>
<bucket bID="1" name="Top" vID="2"/>
<bucket bID="13" name="Bottom" vID="2"/>
</buckets>
</var>
</meta>
<projects>
<project name="Project 1">
<vars>
<var vID="1" bID="2"/>
<var vID="2" bID="1"/>
</vars>
</project>
<project name="Project 2">
<vars>
<var vID="1" bID="1"/>
<var vID="2" bID="13"/>
</vars>
</project>
</projects>
</subIDsForProjects>
XSD...
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
elementFormDefault="qualified" attributeFormDefault="unqualified">
<xs:element name="subIDsForProjects">
<xs:annotation>
<xs:documentation>Simple example showing key/keyRefs for
creating "chained" key refs - doug marttila,
doug@v...</xs:documentation>
</xs:annotation>
<xs:complexType>
<xs:sequence>
<xs:element name="meta">
<xs:complexType>
<xs:sequence>
<xs:element name="var" maxOccurs="unbounded">
<xs:complexType>
<xs:sequence>
<xs:element name="buckets">
<xs:complexType>
<xs:sequence>
<xs:element
name="bucket" maxOccurs="unbounded">
<xs:complexType>
<xs:attribute name="name" type="xs:string" use="required"/>
<xs:attribute name="vID" type="xs:nonNegativeInteger" use="required"/>
<xs:attribute name="bID" type="xs:nonNegativeInteger" use="required"/>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
<xs:unique name="bIDMetaUnique">
<xs:selector
xpath="./bucket"/>
<xs:field xpath="@bID"/>
</xs:unique>
</xs:element>
</xs:sequence>
<xs:attribute name="vID"
type="xs:nonNegativeInteger" use="required"/>
<xs:attribute name="name"
type="xs:string" use="required"/>
</xs:complexType>
<xs:key name="IDKey">
<xs:selector xpath="."/>
<xs:field xpath="@vID"/>
</xs:key>
<xs:keyref name="IDKeyRef" refer="IDKey">
<xs:selector xpath="./buckets/bucket"/>
<xs:field xpath="@vID"/>
</xs:keyref>
</xs:element>
</xs:sequence>
</xs:complexType>
<xs:unique name="uniqueID">
<xs:selector xpath="./var"/>
<xs:field xpath="@vID"/>
</xs:unique>
</xs:element>
<xs:element name="projects">
<xs:complexType>
<xs:sequence>
<xs:element name="project"
maxOccurs="unbounded">
<xs:complexType>
<xs:sequence>
<xs:element name="vars">
<xs:complexType>
<xs:sequence>
<xs:element
name="var" maxOccurs="unbounded">
<xs:complexType>
<xs:attribute name="vID" type="xs:nonNegativeInteger" use="required"/>
<xs:attribute name="bID" type="xs:nonNegativeInteger" use="required"/>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
<xs:unique
name="varIDUniqueProject">
<xs:selector xpath="./var"/>
<xs:field xpath="@vID"/>
</xs:unique>
</xs:element>
</xs:sequence>
<xs:attribute name="name"
type="xs:string" use="required"/>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
<xs:key name="IDPairKey">
<xs:selector xpath="./meta/var/buckets/bucket"/>
<xs:field xpath="@bID"/>
<xs:field xpath="@vID"/>
</xs:key>
<xs:keyref name="IDPairKeyRef" refer="IDPairKey">
<xs:selector xpath="./projects/project/vars/var"/>
<xs:field xpath="@bID"/>
<xs:field xpath="@vID"/>
</xs:keyref>
<xs:key name="IDMetaProjectKey">
<xs:selector xpath="./meta/var"/>
<xs:field xpath="@vID"/>
</xs:key>
<xs:keyref name="IDMetaProjectKeyRef" refer="IDMetaProjectKey">
<xs:selector xpath="./projects/project/vars/var"/>
<xs:field xpath="@vID"/>
</xs:keyref>
</xs:element>
</xs:schema>
Henry S. Thompson wrote:
> -----BEGIN PGP SIGNED MESSAGE-----
> Hash: SHA1
>
> Doug Marttila writes:
>
>
>> I am using a node in my xml to define variables. The defined variables
>> are referenced by ID in another node (a project). The problem is that
>> some variables have sub-ids (the variables are "buckets" instead of
>> numeric values, they can have values like "high" "med" "low")
>>
>
> This is, I'm sorry to say, a Frequently Requested Feature, i.e. there
> is no simple way to achieve what you want.
>
> I think of this as the licence-plate problem -- cars have licence
> plates, which specify state and plate number. Within states, plate
> numbers are unique. Presuming a set of States keyed by @code, each
> containing a sequence of IssuedPlates keyed by @number, to check an
> ObservedPlate with @state and @number we need a _chained_ KeyRef,
> i.e. use @state to identify a State, then use @number to identify an
> IssuedPlate _within that State_.
>
> The work-around you suggest (as it were, copying @code down from State
> onto all IssuedPlates) is the only one I'm aware of.
>
> ht
> - --
> Henry S. Thompson, HCRC Language Technology Group, University of Edinburgh
> Half-time member of W3C Team
> 2 Buccleuch Place, Edinburgh EH8 9LW, SCOTLAND -- (44) 131 650-4440
> Fax: (44) 131 650-4587, e-mail: ht@i...
> URL: http://www.ltg.ed.ac.uk/~ht/
> [mail really from me _always_ has this .sig -- mail without it is forged spam]
> -----BEGIN PGP SIGNATURE-----
> Version: GnuPG v1.2.6 (GNU/Linux)
>
> iD8DBQFDvPIlkjnJixAXWBoRAtwnAJ9tlo6T26W5xXh0aHEHbgWRUmhiBwCeNrrq
> 58tk9hQGA87lf6jcQOlXG+0=
> =RcnZ
> -----END PGP SIGNATURE-----
>
> -----------------------------------------------------------------
> 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>
>
>
>
|
PURCHASE STYLUS STUDIO ONLINE TODAY!Purchasing Stylus Studio from our online shop is Easy, Secure and Value Priced! Download The World's Best XML IDE!Accelerate XML development with our award-winning XML IDE - Download a free trial today! Subscribe in XML format
|
|||||||||

Cart








