xsd - Build XML schema that requires element or attribute, but not both -
i create xml schema following constraints:
- the root element shall
list. listcontains set ofnodeelements.- a
nodeelement can havevalueattribute. - a
nodeelement can containvalueelement. - a
nodeelement can have (and exactly) 1valueattribute orvalueelement.
here example of valid xml verify above constraints:
<?xml version="1.0" ?> <list> <node id="1" value="a" /> <node id="2"> <value>b</value> </node> </list> i tried following xsd schema:
<xs:schema attributeformdefault="unqualified" elementformdefault="qualified" xmlns:xs="http://www.w3.org/2001/xmlschema"> <xs:element name="list"> <xs:complextype> <xs:sequence> <xs:element name="node" maxoccurs="unbounded" minoccurs="0"> <xs:complextype mixed="true"> <xs:sequence> <xs:element type="xs:string" name="value" minoccurs="0"/> </xs:sequence> <xs:attribute type="xs:byte" name="id" use="optional"/> <xs:attribute type="xs:string" name="value" use="optional"/> </xs:complextype> </xs:element> </xs:sequence> </xs:complextype> </xs:element> </xs:schema> this xsd schema verify first , second constraint, not third one.
the following xml example not valid according constraints, however, valid against previous xsd schema.
<?xml version="1.0" ?> <list> <node id="2" value="a" /> <!-- valid --> <node id="4"> <value>d</value> </node><!-- valid --> <node id="1" /><!-- not valid, missing value --> <node id="3" value="b"> <value>c</value> </node><!-- not valid, both attribute , element declared --> </list> how can change schema verify constraints?
thanks in advance.
this not possible using xsd 1.0.
it should possible xsd 1.1 using assertions:
<xs:assert test="not(@value , value)"/> that fails if @value , value both present. check there 1 attribute or sub-element use:
<xs:assert test="count((value, @value))=1"/> as suggested michael kay in comments.
it might possible using other xml validation technology schematron.
Comments
Post a Comment