2009-08-07 3 views
0

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

В примере, у меня есть XML:

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

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

ответ

1

Нет. Вы не можете сделать это в XSD. По сути, у вас есть 2 < b> s с различными типами. Это нарушает Element Consistency rule.

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

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

Так же, как и я. Спасибо за Ваш ответ. – ppiotrowicz

1

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

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

Марк

+0

Благодарим за отзыв. Я посмотрю ближе к схематрону. – ppiotrowicz

0

Нет, но вы лечите имя как тип - и XML-схема делает некоторой поддержка для complexType элемента определяется значением строки. Тем не менее, вы должны использовать имя атрибута «XSI: тип» в документе XML, так что это будет выглядеть следующим образом:

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

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

 Смежные вопросы

  • Нет связанных вопросов^_^