Ограничение значений элементов XML на основе других значений в XSD

Я создаю схему в XSD 1.1 для кроссвордов. Один из моих элементов - <dimensions>. Пример:

<xs:element name="dimensions">
    <xs:simpleType>
      <xs:restriction base="xs:string">
        <xs:pattern value="\d+x\d+"/>
      </xs:restriction>
    </xs:simpleType>
 </xs:element>

Полученный в результате XML будет выглядеть как <dimensions>21x21</dimensions>, что означает, что сетка головоломки составляет 21 квадрат на 21 квадрат.

У меня также есть элемент <cell> для каждого квадрата в головоломке. Итак, для головоломки размером 21x21 у меня будет 441 экземпляр <cell>. У каждого <cell> есть элемент <coordinates>, описывающий его положение в сетке:

<xs:element name="cell">  
    <xs:complexType>  
        <xs:sequence>
            <xs:element name="coordinates">
                <xs:simpleType>
                    <xs:restriction base="xs:string">
                        <xs:pattern value="\d+,\d+"/>
                    </xs:restriction>
                </xs:simpleType>
            </xs:element>
        </xs:sequence>
    </xs:complexType>
</xs:element>

Таким образом, положение квадрата в нижнем левом углу сетки будет представлено как <coordinates>21,1</coordinates>, что указывает на то, что он находится в 21-й строке 1-го столбца.

Я хочу сделать следующее:

  1. Требовать, чтобы на каждый квадрат приходилось по одному <cell> на основе <dimensions>. Например, если размеры 21x21, должно быть 441 экземпляр _12 _-- ни больше, ни меньше.

  2. Требовать, чтобы <coordinates> для каждого <cell> были уникальными и подпадали под параметры <dimensions. Другими словами, для сетки 21x21 каждая ось координат должна быть представлена ​​числом от 1 до 21, и каждая из 441 комбинации может использоваться только один раз.


person Misenus    schedule 11.05.2016    source источник


Ответы (2)


Вам понадобится XSD 1.1; используйте утверждение. Или вам нужно будет параметризовать вашу схему (и, возможно, немного реорганизовать ваш XML), чтобы применить ограничение другим способом (например, если для схемы требуется ровно 21 строка, каждая с ровно 21 ячейкой).

person C. M. Sperberg-McQueen    schedule 11.05.2016
comment
Я использую XSD 1.1, но я не могу параметризовать схему так, чтобы она требовала ровно 21 строку / ячейку, потому что она должна учитывать головоломки с сетками разного размера (например, 15x15). Итак, как мне написать утверждение, которое может сделать параметры зависимыми от размеров? - person Misenus; 11.05.2016
comment
Если вы ДОЛЖНЫ использовать одну и ту же схему для всех головоломок, то, конечно, параметризация не сработает. Но необходимость размещать головоломки разного размера - это причина для параметризации, а не причина, по которой вы не можете этого сделать. О том, как использовать утверждения - что вы пробовали до сих пор? - person C. M. Sperberg-McQueen; 11.05.2016
comment
Думаю, я мог бы создать набор схем для общих типов и размеров сеток, но это, вероятно, выходит за рамки этого проекта, предназначенного для школы; Я пытаюсь создать схему на основе TEI (на основе TEI?) Для кодирования нетрадиционных текстов с большим количеством структур, таких как словесные головоломки. Я почти не понимаю утверждения (я только вчера узнал, что это такое, когда разместил связанный вопрос: stackoverflow.com/questions/37127791/), поэтому я еще не пробовал. - person Misenus; 11.05.2016

Да, утверждения можно использовать, но лучше изменить дизайн XML ...

Информация, которую вы разместите в dimensions, подразумевается структурой ваших cell элементов и может быть получена автоматически, а не может быть установлена ​​произвольно и затем должна проверяться независимо.

Аналогичный аргумент применим к coordinates.

(Также обратите внимание, что даже если вы хотите явно представлять координаты, было бы лучше использовать отдельные элементы или, еще лучше, атрибуты для каждой координаты.)

person kjhughes    schedule 11.05.2016
comment
По целому ряду причин, включая обеспечение правильного ввода данных, я ДЕЙСТВИТЕЛЬНО хочу указать coordinates явно. Итак, если я создаю атрибут координат для каждого cell или двух атрибутов (по одному для каждой оси), мне все равно придется использовать утверждение? Или есть другой способ? - person Misenus; 11.05.2016
comment
Проверка ввода данных лучше выполняется до того, как данные попадут в XML, а отдельные атрибуты, очевидно, не решают ваших проблем с проверкой. Обратите внимание, что я уже показал вам пример того, как использовать утверждения XSD 1.1. Я не буду делать это здесь снова, и, честно говоря, (1) вам не нужны утверждения здесь, если вы исправляете свой дизайн, и (2) если вы настаиваете на том, что они вам нужны, вы должны сами нанести им удар. после того, как вам уже показали, как их использовать. - person kjhughes; 11.05.2016
comment
Я понимаю ваш комментарий о том, что проверка ввода данных лучше выполняется до того, как данные попадут в XML; это то, что я имел в виду, когда попросил способ контролировать количество cells и значения coordinates, чтобы вывести его из рук человека, создающего XML. Поэтому я не прошу утверждения, я просто не понимаю, можно ли исправить мой дизайн таким образом, чтобы координаты были явными без с использованием утверждения, и если да, то что это повлечет за собой. - person Misenus; 11.05.2016