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:assertevery 在父元素上定义断言,以确保子范围在父范围指定的边界内。

断言的外观如下(仅关注关键 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>