Next in thread →
Next in month →
Re: [xml-dev] Validation question
You can validate this kind of constraint using the Schematron assertion language. See http://www.ascc.net/xml/schematron for information and http://www.topologi.com/ for a free Windows validator. (The following are untested, just to give a hint) Kiia Kallio wrote: >There are a few problematic things in SVG: > >- Some elements (such as "feConvolveMatrix") have a matrix as their parameter. This matrix >is defined with two attributes: "order" (number-optional-number) and "kernelMatrix" (list >of numbers). In order for the attributes to be valid, the "kernelMatrix" should have as >many values as the order defines (for instance order = "3, 2" means that the matrix should >have 6 values). There are also other cases of cross-dependencies like this. > > The validation code for this will be quite klunky, but certainly possible. The latest version of Schematron (1.1.6) has a let expression that helps, and I expect newer versions based on XPath 2 will be around soon; these will have features that should directly make this kind of constraint simpler to model. <rule context="svg:feConvolveMatrix[@order][@kernelMatrix]" <let name="car" value="string-before(@order, ',')" /> <let name="cdr" value="string-after(@order, ',')" /> <let name="orderValue" value=" number( $car) * number( $cdr )" /> <let name="first" value="string-before(@kernelMatrix, ',')" /> <let name="after-first" value="string-after(@kernelMatrix, ',')" /> <let name="second" value="string-before( $after-first , ',')" /> <let name="after-second" value="string-after( $after-first , ',')" /> <let name="third" value="string-before( $after-second , ',')" /> <let name="after-third" value="string-after( $after-second , ',')" /> ... <assert test="( $orderValue = 1 and not string-contains(@kernelMatrix, ',')) or (($orderValue < 1 or number(first)) and (( $orderValue < 2 or number( $second )) and (( $orderValue < 3 or number( $third )) ... " > The kernelMatrix should have as many values as the order attribute specifies </assert> For some versions of schematron before 1.1.6 you will have to make a single big fat Xpath for all those things: it will rapidly explode in size. >- Animation elements ("animate", "set", "animateColor", "animateTransform", "animateMotion") >have some attributes ("by", "from", "to", "values") that define the new values for the >animated attribute of some other element. The valid values for the attribute depend on the >target attribute and the target element that has the attribute. For instance markup ><set xlink:href = "#foobar" attributeName="type" to="turbulence" begin="3s" dur="6s"/> >is completely valid if the element whose id is "foobar" is "feTurbulence". If it happens >to be for instance "feColorMatrix", this is not valid. "feColorMatrix" does have "type" >attribute, but "turbulence" is not a valid value for that. (And it is not even necessary to >define "xlink:href" attribute to specify the animated element, but if the attribute is >missing, the animation target is the parent element. > <rule context="svg:set"> <let name="constructedName" value="..XPath to make feTurbulence from turbulence" /> <assert test="//*[name() = $constructedName ][@id=string-after(current()/@xlink:href, '#')]" /> The set element's href must point to an element of type <value-of select=" $constructed-name" />. </assert> </rule> >So, I'd like to know if any validation schema can handle such things like cross- >dependencies of attributes, dependencies between attributes and element types, and >parsing of complex attributes for validating them, or (as the designers of various >schemas are probably reading the list) if there are any plans for the features I'm >looking for. > As mentioned, Schematron is good for all these things, with the current shortfalling (inherited from XPath1) that parsing complex attribute values is cumbersome. This should change soon with XPath2. >One option I think would be to construct some sort of XSLT transformation that re-formats >complex attributes to XML that is easier to validate (like the path example above) but I >know very little about XSLT, so I don't really know if it can handle things like this. If >somebody has pointers for cases where this has been succesfully done, I'd be grateful. > Look at Simon StLaurent's "Regular Fragmentations" code for a start. Cheers Rick Jelliffe
Next in thread →
Next in month →