проверка значений атрибутов элементов xml - PullRequest
1 голос
/ 13 июля 2011

Я пытаюсь написать документ xsd, который проверяет следующий фрагмент xml.

<parentElement>
    <someElement name="somethingRequired"/>
    <someElement name="somethingElseRequired"/>
    <someElement name="anything"/>
</parentElement>

Он должен проверяться, если parentElement содержит как минимум два вхождения someElement, где у одного есть имя атрибута, содержащее значение «thingRequired », а у другого - имя атрибута, содержащее значение« SomeElseRequired ".

Возможно ли это?

Ответы [ 2 ]

2 голосов
/ 13 июля 2011

Возможно ли это?

Это зависит от того, насколько конкретными должны быть ваши ограничения. Если достаточно, чтобы все атрибуты name имели уникальные значения, то этого можно достичь с помощью <xs:unique>

<xs:schema elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="parentElement">
    <xs:complexType>
      <xs:sequence>
        <xs:element minOccurs="2" maxOccurs="unbounded" name="someElement">
          <xs:complexType>
            <xs:attribute name="name" type="xs:string" />
          </xs:complexType>
        </xs:element>
      </xs:sequence>
    </xs:complexType>
    <xs:unique name="uniqueName">
      <xs:selector xpath="someElement" />
      <xs:field xpath="@name" />
    </xs:unique>
  </xs:element>
</xs:schema>

Вы также можете ограничить значения атрибутов, например, некоторым перечислимым набором допустимых значений вместо простого использования type="xs:string". Однако невозможно ограничить уникальность только первых двух атрибутов имени, поскольку атрибут xpath не может содержать предикаты.

Если вам нужно, чтобы первый атрибут имени имел какое-то конкретное значение, второй - какое-то другое конкретное значение, а остальные должны иметь какое-либо значение, то я бы сказал, что это либо нарушает ограничение компонента схемы Согласованные объявления элементов или потребовалось бы какое-то ограничение совместного вхождения, более конкретное, чем <xs:unique>, поэтому в общем случае это было бы невозможно. Возможно, вы сможете сделать это, используя атрибут xsi:type в документе экземпляра, чтобы явно объявить тип элемента.

0 голосов
/ 13 июля 2011

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

...