如何使用Schema基于属性值验证元素?

时间:2008-10-08 20:15:18

标签: xml validation schema xsd

我正在尝试验证的XML如下:

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

如何使用Schema验证?

注意:

attribute =“foo”时,

元素只能包含

attribute =“hello”

时,

元素只能包含世界

1 个答案:

答案 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>