J
jasonnerothin
I'm trying to figure out exactly what's going wrong with an xpath
keyref validation scenario.
In brief, I have something like the following in my xsd:
<xs:schema>
<xs:complexType name="topLevelContainer">
<!-- define an element -->
<xs:complexType name="element">
...
<xs:attribute name="id" type="xs:int" use="required"/>
</xs:complexType>
<!-- instance one, simple list -->
<xs:element name="instanceOne" minOccurs="0">
<xs:sequecne>
<xs:element name="elementDescription" type="element"
minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
<!-- instance two, an inner, heterogenous list -->
<xs:complexType name="instanceTwo" type="anotherType">
<xs:element name="elementList">
<xs:complexType>
<xs:choice maxOccurs="unbounded">
<xs:complexType name="fullElement"
type="elementType"/>
<xs:complexType name="elementRef" type="xs:int"/>
</xs:choice>
</xs:complexType>
</xs:sequence>
<!-- constraints -->
<!-- key points to the id attribute of instanceOne type -->
<xs:key name="elementKey">
<xs:selector xpath="instanceOne/elementDescription"/>
<xs:field xpath="@id">
</xs:key>
<!-- keyref points to more-deeply nested instanceTwo type -->
<xs:keyref name="elementRef" refer="elementKey">
<xs:selector xpath="instanceTwo/elementList/elementRef"/>
<xs:field xpath="."/>
</xs:keyref>
</xs:complexType> <!-- end top-level container -->
</xs:schema>
In short, what I am trying to do is ensure that the references from
within the instanceTwo type point to elements within the instanceOne
type. But what I'm not able to figure out is how to enforce that the
instanceTwo type contain references to fully described elements in
instanceOne only. For some reason, a file will validate when the
references out of instanceTwo refer to elementDescriptions from other
instanceTwos in the file.
I'm suspicious that the xpath comparison will never return false for
some reason related to datatype. (My xml editor seems to suggest that
the xpath expressions are returning the appropriate values.)
???
keyref validation scenario.
In brief, I have something like the following in my xsd:
<xs:schema>
<xs:complexType name="topLevelContainer">
<!-- define an element -->
<xs:complexType name="element">
...
<xs:attribute name="id" type="xs:int" use="required"/>
</xs:complexType>
<!-- instance one, simple list -->
<xs:element name="instanceOne" minOccurs="0">
<xs:sequecne>
<xs:element name="elementDescription" type="element"
minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
<!-- instance two, an inner, heterogenous list -->
<xs:complexType name="instanceTwo" type="anotherType">
<xs:element name="elementList">
<xs:complexType>
<xs:choice maxOccurs="unbounded">
<xs:complexType name="fullElement"
type="elementType"/>
<xs:complexType name="elementRef" type="xs:int"/>
</xs:choice>
</xs:complexType>
</xs:sequence>
<!-- constraints -->
<!-- key points to the id attribute of instanceOne type -->
<xs:key name="elementKey">
<xs:selector xpath="instanceOne/elementDescription"/>
<xs:field xpath="@id">
</xs:key>
<!-- keyref points to more-deeply nested instanceTwo type -->
<xs:keyref name="elementRef" refer="elementKey">
<xs:selector xpath="instanceTwo/elementList/elementRef"/>
<xs:field xpath="."/>
</xs:keyref>
</xs:complexType> <!-- end top-level container -->
</xs:schema>
In short, what I am trying to do is ensure that the references from
within the instanceTwo type point to elements within the instanceOne
type. But what I'm not able to figure out is how to enforce that the
instanceTwo type contain references to fully described elements in
instanceOne only. For some reason, a file will validate when the
references out of instanceTwo refer to elementDescriptions from other
instanceTwos in the file.
I'm suspicious that the xpath comparison will never return false for
some reason related to datatype. (My xml editor seems to suggest that
the xpath expressions are returning the appropriate values.)
???