Схема XML: требуется, чтобы элемент присутствовал, когда присутствует другой - PullRequest
3 голосов
/ 09 января 2012

Моя схема позволяет определенному элементу быть необязательным, но когда я позже сталкиваюсь с другим и необязательным элементом в файле, мне нужно, чтобы предыдущий элемент присутствовал. Как я могу убедиться в этом через XSD?

Пример:

<settings>
  <file name="narf.txt"/>
  <metafile name="narf.meta"/>
  <filtermeta>true</filtermeta>
</settings>

должно быть действительным,

<settings>
  <file name="narf.txt"/>
  <metafile name="narf.meta"/>
</settings>

и

<settings>
  <file name="narf.txt"/>
</settings>

тоже должен быть действительным,

<settings>
  <file name="narf.txt"/>
  <filtermeta>true</filtermeta>
</settings>

не должен быть действительным.

Ответы [ 2 ]

3 голосов
/ 09 января 2012

Попробуйте следующее определение схемы:

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
  <xs:element name="settings">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="file">
          <xs:complexType>
            <xs:attribute name="name" type="xs:string"/>
          </xs:complexType>
        </xs:element>
        <xs:sequence minOccurs="0">
          <xs:element name="metafile">
            <xs:complexType>
              <xs:attribute name="name" type="xs:string"/>
            </xs:complexType>
          </xs:element>
          <xs:element minOccurs="0" name="filtermeta" type="xs:string"/>
        </xs:sequence>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
</xs:schema>

Я запустил ваши первые три примера для этой схемы, используя xmllint, и они проверяются правильно. Четвертый пример завершается с:

cvc-complex-type.2.4.a: Invalid content was found starting with element 'filtermeta'. One of '{metafile}' is expected.

как и ожидалось.

0 голосов
/ 29 января 2015

Вы можете иметь filtermeta в качестве необязательного атрибута для элемента metafile.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...