Как ограничить набор атрибутов в xsd - PullRequest
3 голосов
/ 10 июня 2011

Все Подскажите пожалуйста как ограничить в схеме xsd следующее:

<root>
  <node action="action1" parameter="1" />
</root>

Мне требуется атрибут «параметр», только если определен атрибут «действие».

Спасибо

Ответы [ 2 ]

4 голосов
/ 10 июня 2011

Схема W3C не имеет возможности выражать условно обязательные атрибуты.

Schematron - отличный инструмент для проверки того, что документы соответствуют пользовательским сценариям проверки вкакой контент является условно обязательным.

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

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

Я создал этот xsd, чтобы попытаться решить проблему.

<?xml version="1.0" encoding="utf-8"?>
<xs:schema id="XMLSchema1"
    targetNamespace="http://tempuri.org/XMLSchema1.xsd"
    elementFormDefault="qualified"
    xmlns="http://tempuri.org/XMLSchema1.xsd"
    xmlns:mstns="http://tempuri.org/XMLSchema1.xsd"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
>
  <xs:group name="populated">
    <xs:sequence >
      <xs:element name="node">
        <xs:complexType>
          <xs:attributeGroup ref="actionattrib" />
        </xs:complexType>
      </xs:element>
    </xs:sequence>
  </xs:group>
  <xs:group name="unpopulated">
    <xs:sequence >
      <xs:element name="node">
        <xs:complexType>
        </xs:complexType>
      </xs:element>
    </xs:sequence>
  </xs:group>
  <xs:attributeGroup name ="actionattrib">
    <xs:attribute name="action1" type="xs:string" />
    <xs:attribute name="parameter" type="xs:int" />
  </xs:attributeGroup>
  <xs:element name="root">
    <xs:complexType>
      <xs:choice minOccurs ="0">
        <xs:group ref="populated" />
        <xs:group ref ="unpopulated" />
      </xs:choice>
    </xs:complexType>
  </xs:element>
</xs:schema>

И метод тестирования:

    public static void Go()
    {
        string nameSpace = "http://tempuri.org/XMLSchema1.xsd";
        XmlSchemaSet schemas = new XmlSchemaSet();
        schemas.Add(nameSpace, "XMLSchema1.xsd");

        XDocument myDoc1 = new XDocument(
            new XElement(XName.Get("root", nameSpace),
                new XElement( XName.Get("node", nameSpace ))
                )
            );
        myDoc1.Validate(schemas, (o, e) => { Console.WriteLine(e.Message); });
    }

И, наконец, получил это исключение при проверке:

Множественное определение элемента 'http://tempuri.org/XMLSchema1.xsd:node' приводит к тому, что модель содержимого становится неоднозначной.Модель содержимого должна быть сформирована таким образом, чтобы во время проверки последовательности элементов информации об элементе, частица, содержащаяся прямо, косвенно или неявно в ней, чтобы попытаться проверить каждый элемент в последовательности, в свою очередь, может быть однозначно определена без изучения содержимогоили атрибуты этого элемента и без какой-либо информации об элементах в оставшейся части последовательности.

Что соответствует результату Мадса.Его ответ должен быть принят.

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