2

検証しようとしている XML は次のとおりです。

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

これはスキーマを使用してどのように検証できますか?

ノート:

要素には、 attribute="foo"の場合にのみbarを含めることができます。

要素には、 attribute="hello"の場合にのみworldを含めることができます

4

1 に答える 1

6

これは XML スキーマ 1.0 ではできません。XML Schema 1.1 では、<xs:assert>要素を使用してそれを行うことができますが、今すぐ使用できるものが必要になると思います。

XML ドキュメントに関する任意の XPath アサーションをテストできる検証の 2 番目のレイヤーとしてSchematronを使用できます。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 に答える