2

我要验证的 XML 如下:

<root>
    <element attribute="foo">
        <bar/>
    </element>
    <element attribute="hello">
        <world/>
    </element>
</root>

如何使用 Schema 进行验证?

笔记:

元素只能在attribute="foo"时包含bar

元素只能在属性=“你好”时包含世界

4

1 回答 1

6

您不能在 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>
于 2008-10-08T21:59:00.673 回答