对于下面的XSD,我想在不同深度的元素之间实现依赖。如何修改此模式以实现对XML的以下验证:
如果元素名为" 值"未在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)
答案 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编写相同的规则。