【问题标题】:Can XML schema validate against parent attribute values?XML 模式可以根据父属性值进行验证吗?
【发布时间】:2016-07-11 21:59:53
【问题描述】:

我正在将 XML 用于地理定位项目。这使用属性来定义项目的位置。范围 0-9 的简单一维示例是:

<Range Start="0" Size="10">Some item</Range>

有些项目有孩子。子项必须始终在父项的范围内。在下面的 XML 中,子元素的 Start 属性设置为 12。这超出了父元素定义的逻辑范围:

<Range Start="0" Size="10">
   <Range Start="12" Size="1">Out of range 0-9</Range>
</Range>

XSD 架构能否检测到这种情况,还是无法针对父属性值进行验证?

【问题讨论】:

    标签: xml xsd xsd-validation xml-validation


    【解决方案1】:

    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>
    

    【讨论】:

    猜你喜欢
    • 2021-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多