XSD架构 - 如何在不同级别的元素之间创建依赖关系

时间:2015-09-03 09:59:07

标签: xml xsd

对于下面的XSD,我想在不同深度的元素之间实现依赖。如何修改此模式以实现对XML的以下验证:

  • 如果" 信息"元素不存在于XML中,然后元素" "必须存在于每个" ObjectData "
  • 如果元素名为" "未在XML中为一个或多个" ObjectData "指定元素,而不是名为" 信息"必须在场

        <xs:element name="Objects" minOccurs="0" maxOccurs="1" >
            <xs:complexType>
                <xs:all>
                    <xs:element name="Info" type="Info" minOccurs="0" maxOccurs="1"/>
                    <xs:element name="ObjectData" minOccurs="1" maxOccurs="unbounded">
                        <xs:complexType>
                            <xs:all>
                                <xs:element name="ObjType" type="ObjTypeEnum" />
                                <xs:element name="Value" type="xs:decimal" minOccurs="0" maxOccurs="1"/>
                                <xs:element name="Prop" type="properties" />
                            </xs:all>
                        </xs:complexType>
                    </xs:element>
                </xs:all>
            </xs:complexType>
        </xs:element>
    

理解上述两个要求的另一种方法是

if( Objects.Info.occurs == 0 )
    For-each Objectdata in Objects
        assert(ObjectData.Value.occurs == 1)

For-atleast-one ObjectData in Objects
    if ( ObjectData.Value.occurs == 0 )
        assert(Objects.Info.occurs == 1)

1 个答案:

答案 0 :(得分:1)

  

Mathias我正在使用这个在线工具freeformatter.com/xml-validator-xsd.html。我想它的XSD 1.0。我将不得不看看xs:assert功能。 XSD 1.1对我来说是新的

是的,freeformatter在线验证程序仅支持XML Schema 1.0。我通过在类型定义中提交包含<xsd:assert test="true()" />的XSD文档来测试它。这导致:

S4s-elt-invalid-content.1: The Content Of '#AnonType_list' Is Invalid. 
Element 'assert' Is Invalid, Misplaced, Or Occurs Too Often.

这与您的情况相关,因为表示依赖性约束(如x if y and z, otherwise not(x))的唯一方法是断言。不幸的是,断言是XML Schema 1.1独有的一个特性。

所以,不,如果你不能使用其他工具/ XSD 1.1验证引擎来执行验证,这是不可能的。

如果您可以使用像Xerces或Saxon-EE这样的引擎,我很高兴在XSD 1.1中详细说明断言解决方案。或者,可以使用另一种模式语言Schematron编写相同的规则。