我正在尝试验证的XML如下:
<root>
<element attribute="foo">
<bar/>
</element>
<element attribute="hello">
<world/>
</element>
</root>
如何使用Schema验证?
注意:
当 attribute =“foo”时,元素只能包含栏。
当 attribute =“hello” 时,元素只能包含世界
答案 0 :(得分:6)
您无法在XML Schema 1.0中执行此操作。在XML Schema 1.1中,您将能够使用<xs:assert>
element来完成它,但我猜你想要一些你现在可以使用的东西。
您可以使用Schematron作为第二层验证,允许您测试有关XML文档的任意XPath断言。有一篇关于embedding Schematron in XSD的相当古老的文章,你可能会觉得有帮助。
你会做类似的事情:
<rule context="element">
<report test="@attribute = 'foo' and *[not(self::bar)]">
This element's attribute is 'foo' but it holds an element that isn't a bar.
</report>
<report test="@attribute = 'hello' and *[not(self::world)]">
This element's attribute is 'hello' but it holds an element that isn't a world.
</report>
</rule>
当然,您可以切换到RELAX NG,这会在睡眠中执行此操作:
<element name="element">
<choice>
<group>
<attribute name="attribute"><value>foo</value></attribute>
<element name="bar"><empty /></element>
</group>
<group>
<attribute name="attribute"><value>hello</value></attribute>
<element name="world"><empty /></element>
</group>
</choice>
</element>