XSD: случайный порядок одноименных <elements>с разными типами = НЕВОЗМОЖНО - PullRequest
1 голос
/ 03 июня 2011

Искал и экспериментировал, исследовал и ломал голову над этим (мечтал об этом вчера вечером).

Попытка построить схему XSD для проверки следующего примера XML на основе ограничений тега в зависимости от значениятега.

<data>
  <dataSet>
    <title>mediaType</title>
    <value>FullLength</value>
  </dataSet>
  <dataSet>
    <title>available</title>
    <value>true</value>
  </dataSet>
  <dataSet>
    <title>country</title>
    <value>Canada</value>
  </dataSet>
</data>

схема, касающаяся ограничений на отдельные наборы данных

<xs:complexType name="typeAvailable">
    <xs:sequence>
        <xs:element name="title">
            <xs:simpleType>
                <xs:restriction base="xs:string">
                    <xs:pattern value="available" />
                </xs:restriction>
            </xs:simpleType>
        </xs:element>
        <xs:element name="value">
            <xs:simpleType>
                <xs:restriction base="xs:boolean" />
            </xs:simpleType>
        </xs:element>
    </xs:sequence>
</xs:complexType>

<xs:complexType name="typeMediaType">
    <xs:sequence>
        <xs:element name="title">
            <xs:simpleType>
                <xs:restriction base="xs:string">
                    <xs:pattern value="mediaType" />
                </xs:restriction>
            </xs:simpleType>
        </xs:element>
        <xs:element name="value">
            <xs:simpleType>
                <xs:restriction base="xs:string">
                    <xs:pattern value="FullLength|Clip" />
                </xs:restriction>
            </xs:simpleType>
        </xs:element>
    </xs:sequence>
</xs:complexType>

<xs:complexType name="typeCountry">
    <xs:sequence>
        <xs:element name="title">
            <xs:simpleType>
                <xs:restriction base="xs:string">
                    <xs:pattern value="typeCountry" />
                </xs:restriction>
            </xs:simpleType>
        </xs:element>
        <xs:element name="value">
            <xs:simpleType>
                <xs:restriction base="xs:string">
                    <xs:pattern value="Canada|US" />
                </xs:restriction>
            </xs:simpleType>
        </xs:element>
    </xs:sequence>
</xs:complexType>

Лучшее, что я мог придумать, не проверяется, когда набор данных вышелпорядка (которым они будут)

<xs:complexType name="typeData">
    <xs:all>
        <xs:element name="dataSet" type="typeMediaType" />
        <xs:element name="dataSet" type="typeAvailable" />
        <xs:element name="dataSet" type="typeCountry" />
    </xs:all>
</xs:complexType>

Конечно, я застрял с данными, которые я получаю, но ничто не говорит, что я не могу преобразовать их с помощью XSLT - во что, я нея знаюЯ надеялся на элегантное решение XSD, увы, боюсь, что это невозможно.

Кто-нибудь может доказать, что я не прав?Это мой первый проект схемы за довольно долгое время.

ОБНОВЛЕНИЕ

Вы знаете, что, я думаю, я собираюсь проверить его структуру, прочитайте часть с LINQ и преобразование его через XSLT в

<data>
    <mediaType>FullLength</mediaType>
    <available>true</available>
    <country>Canada</country>
</data>

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

Ответы [ 2 ]

1 голос
/ 04 июня 2011

«Условные» ограничения невозможны с XML-схемой. Есть несколько трюков с ключами, но они очень ограничены. Подумайте об использовании Schematron, у него гораздо больше возможностей для проверки.

Как правило, XML-схема больше относится к структуре и типизации, ее ограничивающие возможности очень ограничены.

0 голосов
/ 05 июня 2011

Элементы с одинаковыми именами разных типов запрещены ограничением Объявления элементов .

...