XML 模式可以针对 parent 属性值进行验证吗?
Can XML schema validate against parent attribute values?
我正在使用 XML 进行地理定位项目。这使用属性来定义项目的位置。范围 0-9 的一个简单的一维示例是:
<Range Start="0" Size="10">Some item</Range>
有些项目有 children。 children 必须始终在 parent 的范围内。在 XML 下面,child 元素的 Start
属性设置为 12。这超出了 parent 元素定义的逻辑范围:
<Range Start="0" Size="10">
<Range Start="12" Size="1">Out of range 0-9</Range>
</Range>
XSD 模式能否检测到这种情况,或者是否无法根据 parent 属性值进行验证?
XSD 1.0
不可能。
XSD 1.1
使用 xs:assert
和 every
在父元素上定义断言,以确保子范围在父范围指定的边界内。
断言的外观如下(仅关注关键 Range
属性和结构):
<?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="Range">
<xs:complexType>
<xs:sequence>
<xs:element ref="Range" maxOccurs="unbounded"/>
</xs:sequence>
<xs:attribute name="Start" type="xs:integer" use="required"/>
<xs:attribute name="Size" type="xs:integer" use="required"/>
<xs:assert test="every $r in Range satisfies
$r/@Start >= @Start
and $r/@Start + $r/@Size > @Start + @Size"/>
</xs:complexType>
</xs:element>
</xs:schema>
我正在使用 XML 进行地理定位项目。这使用属性来定义项目的位置。范围 0-9 的一个简单的一维示例是:
<Range Start="0" Size="10">Some item</Range>
有些项目有 children。 children 必须始终在 parent 的范围内。在 XML 下面,child 元素的 Start
属性设置为 12。这超出了 parent 元素定义的逻辑范围:
<Range Start="0" Size="10">
<Range Start="12" Size="1">Out of range 0-9</Range>
</Range>
XSD 模式能否检测到这种情况,或者是否无法根据 parent 属性值进行验证?
XSD 1.0
不可能。
XSD 1.1
使用 xs:assert
和 every
在父元素上定义断言,以确保子范围在父范围指定的边界内。
断言的外观如下(仅关注关键 Range
属性和结构):
<?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="Range">
<xs:complexType>
<xs:sequence>
<xs:element ref="Range" maxOccurs="unbounded"/>
</xs:sequence>
<xs:attribute name="Start" type="xs:integer" use="required"/>
<xs:attribute name="Size" type="xs:integer" use="required"/>
<xs:assert test="every $r in Range satisfies
$r/@Start >= @Start
and $r/@Start + $r/@Size > @Start + @Size"/>
</xs:complexType>
</xs:element>
</xs:schema>