3 " /> 3 " /> 3 "/>

Struggling with key-keyref

42 Views Asked by At

I am strugling with understanding key:keyref in xml.

My structure

<Regions>
    <Region Name="Simple region name">
        <NumberOfWineries>3</NumberOfWineries>
        <Winery Name="Simple winery">
            <City>Simple city</City>
            <Owner>Simple owner</Owner>
            <Image photo="img_winary"/>  
            <NumberOfDiffrentWines>2</NumberOfDiffrentWines>
            <Wines>
                <Wine Name="Cool wine" Vintage="2003">
                    <Characteristics>
                        <Color>blue</Color>
                    </Characteristics>
                </Wine>
            </Wines>
        </Winery>
    </Region>
    <Region....> 
        .....
    </Region>
</Regions>

Here I am strugling with making key:keyref from wine to winery.

I was thinking of making an unique id of winery and refering to that id for every wine.

Something like

<winery id="1" />
<wine idref="1" />

It is not so clear to me, can someone guide me if I am going on a wrong path.

Thank you in advance.

1

There are 1 best solutions below

0
Tony On

Code exmaple is following, some details are omitted:

<xs:element name="root" type="Root">
    <xs:key name="aKey">
        <xs:selector xpath=".//Winery"/>
        <xs:field xpath="@id"/>
    </xs:key>
    <xs:keyref name="aKeyRef" refer="aKey">
        <xs:selector xpath=".//wine"/>
        <xs:field xpath="@wineryRef"/>
    </xs:keyref>
</xs:element>
<xs:complexType name="Root">
    <xs:sequence>
        <xs:element ref="Winery"/>
    </xs:sequence>
</xs:complexType>
<xs:element name="Winery">
    <xs:complexType>
        <xs:sequence>
            <xs:element name="Wines" type="wines"/>
        </xs:sequence>
        <xs:attribute name="id" type="xs:string" use="required"/>
    </xs:complexType>
</xs:element>
<xs:complexType name="wines">
    <xs:sequence>
        <xs:element name="wine" type="wine" maxOccurs="unbounded"/>
    </xs:sequence>
</xs:complexType>
<xs:complexType name="wine">
    <xs:sequence>
        <xs:element name="chara" type="xs:string"/>
    </xs:sequence>
    <xs:attribute name="wineryRef" type="xs:string"/>
</xs:complexType>

Some important notes:

  • Define key and keyref in the body of element
  • Use suitable XPath syntax to refer your node

You can find more examples and explanation in my xsd tutorial.