Как вы можете проверить элементы на основе атрибута Value, используя схему? - PullRequest
2 голосов
/ 09 октября 2008

XML, который я пытаюсь проверить, выглядит следующим образом:

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

Как это можно проверить с помощью схемы?

Примечание:

элемент может содержать bar только когда attribute = "foo" .

элемент может содержать только world когда attribute = "hello"

1 Ответ

6 голосов
/ 09 октября 2008

Вы не можете сделать это в XML Schema 1.0. В XML Schema 1.1 вы сможете использовать для этого элемент <xs:assert> , но я предполагаю, что вы хотите что-то, что вы можете использовать сейчас.

Вы можете использовать Schematron в качестве второго уровня проверки, который позволит вам проверить произвольные утверждения XPath относительно вашего XML-документа. Есть довольно старая статья о встраивании Schematron в 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>
...