Ограничения XSD - PullRequest
       6

Ограничения XSD

0 голосов
/ 07 августа 2009

Возможно ли использовать XSD для ограничения имен узлов в перечислении, а затем на основе этого перечисления добавить другие ограничения?

Например, у меня есть этот xml:

<a>
    <b name="string" value="hello">
    <b name="integer" value="123">
</a>

Я хочу, чтобы узлы "b" имели атрибут name из перечисления {"string", "integer"}. Тогда, если это «строка», я хочу, чтобы этот атрибут «значение» был типом xs: string, и если это "целое число", я хочу, чтобы этот атрибут "значение" был типом xs: integer.

Ответы [ 3 ]

1 голос
/ 07 августа 2009

Нет. Вы не можете сделать это в XSD. По сути, у вас есть 2 с разных типов. Это нарушает правило согласованности элементов .

У вас есть несколько вариантов,

  1. Применять правила вне схемы в вашем приложении. Это то, что я сделаю.
  2. Используйте язык валидации, такой как Schematron, как упоминалось другими.
  3. Переключиться на более мощный язык схем, такой как Relax NG .
1 голос
/ 07 августа 2009

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

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

Марк

0 голосов
/ 07 августа 2009

Нет. Но вы воспринимаете имя как тип - и XML Schema имеет некоторую поддержку complexType элемента, определяемого строковым значением. Однако вы должны использовать имя атрибута "xsi: type" в вашем XML-документе, чтобы оно выглядело так:

<a>
    <b xsi:type="string" value="hello">
    <b xsi:type="integer" value="123">
</a>

Боюсь, это лучшее, что может сделать XML-схема. Более подробная информация в официальном учебнике (который, к сожалению, может сбить с толку): http://www.w3.org/TR/xmlschema-0/#UseDerivInInstDocs

...