[Date Prev]
| [Thread Prev]
| [Thread Next]
| [Date Next]
--
[Date Index]
| [Thread Index]
Re: [xml-dev] XSD 1.1 - assert a condition of a complex type dependingon another element's attribute value
- From: =?UTF-8?B?TWFpayBTdMKfw7xocmVuYmVyZw==?=<maik.stuehrenberg@uni-bielefeld.de>
- To: Michael Kay <mike@saxonica.com>
- Date: Fri, 23 Oct 2009 10:46:35 +0200
Hello Michael,
thank you very much for the quick response.
Michael Kay schrieb:
>> <xs:complexType>
>> <xs:attribute name="start" type="xs:integer" use="required"/>
>> <xs:attribute name="end" type="xs:integer" use="required"/>
>> <xs:assert test="@start ge root(.)/cd/pd/@start"/>
>> <xs:assert test="@end le root(.)/cd/pd/@end"/>
>> </xs:complexType>
>
> xs:assert sees a tree fragment rooted at the element E whose type you are
> testing against. root(.) returns the root of this tree, that is, the element
> E. The idea is that validation of an element depends only on the content of
> that element, not on the context in which it appears. XSLT, for example,
> assumes that if you copy a valid element to a new tree, then it will still
> be valid (against the original type).
>
>> What I want is to assert that the value of the start
>> attribute of each s element is greater or equal than that of
>> the start attribute of the pd element (and vice versa for the
>> end attribute).
>>
Thanks for the clarification, I guess I have to read the specs more
thoroughly.
>
> You need to put the assertion at the level of the common ancestor: that is,
> identify the element that contains all the data needed to compute the
> assertion, and put the assertion on the type of that element.
That was an idea I had in mind, but I wasn't sure if the @test XPath
expression would really test for every single s child of segs.
So the correct assert would be inside the cd element:
<xs:element name="cd">
<xs:complexType>
<xs:sequence>
<xs:element ref="pd" minOccurs="1" maxOccurs="unbounded"/>
<xs:element ref="segs"/>
</xs:sequence>
<xs:assert test="pd/@start le segs/s/@start"/>
<xs:assert test="pd/@end ge segs/s/@end"/>
</xs:complexType>
</xs:element>
But if I try that I still get two validation errors:
Element cd does not satisfy assertion pd/@end ge segs/s/@end
Element cd does not satisfy assertion pd/@start le segs/s/@start
I understand and agree that the value of the s/end attribute raises the
error but why does the start attribute's value?
In addition the problem with that solution is that the error is raised
for the common ancestor which makes it much harder to inspect the wrong
s element (if I imagine hundreds of s elements and only one is wrong...)
-- which was a reason why I tried to locate the assert elements
underneath the s element.
Again, thank you very much for your hints.
Best regards,
Maik Stührenberg
>
> Regards,
>
> Michael Kay
> http://www.saxonica.com/
> http://twitter.com/michaelhkay
>
>
[Date Prev]
| [Thread Prev]
| [Thread Next]
| [Date Next]
--
[Date Index]
| [Thread Index]