问题
I am trying to write an assertion that will make the values of @row
and @column
less than or equal to the values of @rows
and @columns
in the parent element <structure>
.
<xs:element name="structure">
<xs:complexType>
<xs:sequence>
<xs:element name="cell" maxOccurs="unbounded">
<xs:complexType>
<xs:attribute name="row" type="xs:positiveInteger"/>
<xs:attribute name="column" type="xs:positiveInteger"/>
<xs:assert test="@row le @rows"/>
<xs:assert test="@column le @columns"/>
</xs:complexType>
</xs:element>
</xs:sequence>
<xs:attribute name="rows" type="xs:positiveInteger" use="optional"/>
<xs:attribute name="columns" type="xs:positiveInteger" use="optional"/>
</xs:complexType>
</xs:element>
Are my assertions in the wrong place? What XPath expression do I use to specify the parent node? My editor isn't letting me write ..@rows
.
回答1:
An assertion XPath cannot reach outside of its context.
So, move your assertion up to the structure
element, and use an every ... satisfies
assertion test:
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:vc="http://www.w3.org/2007/XMLSchema-versioning"
elementFormDefault="qualified"
vc:minVersion="1.1">
<xs:element name="structure">
<xs:complexType>
<xs:sequence>
<xs:element name="cell" maxOccurs="unbounded">
<xs:complexType>
<xs:attribute name="row" type="xs:positiveInteger"/>
<xs:attribute name="column" type="xs:positiveInteger"/>
</xs:complexType>
</xs:element>
</xs:sequence>
<xs:attribute name="rows" type="xs:positiveInteger" use="optional"/>
<xs:attribute name="columns" type="xs:positiveInteger" use="optional"/>
<xs:assert test="every $r in cell/@row satisfies @rows >= $r"/>
<xs:assert test="every $c in cell/@column satisfies @columns >= $c"/>
</xs:complexType>
</xs:element>
</xs:schema>
来源:https://stackoverflow.com/questions/37176384/how-to-access-parent-element-in-xsd-assertion-xpath