我要验证的 XML 如下:
<root>
<element attribute="foo">
<bar/>
</element>
<element attribute="hello">
<world/>
</element>
</root>
如何使用 Schema 进行验证?
笔记:
元素只能在attribute="foo"时包含bar。
元素只能在属性=“你好”时包含世界
我要验证的 XML 如下:
<root>
<element attribute="foo">
<bar/>
</element>
<element attribute="hello">
<world/>
</element>
</root>
如何使用 Schema 进行验证?
笔记:
元素只能在attribute="foo"时包含bar。
元素只能在属性=“你好”时包含世界
您不能在 XML Schema 1.0 中做到这一点。在 XML Schema 1.1 中,您将能够使用该<xs:assert>
元素来执行此操作,但我猜您想要一些现在可以使用的东西。
您可以使用Schematron作为第二层验证,它允许您测试关于您的 XML 文档的任意 XPath 断言。有一篇关于在 XSD 中嵌入 Schematron的相当古老的文章,您可能会发现它很有帮助。
你会做这样的事情:
<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>