Ограничение значений в списке значений ключей XML с использованием XSD - PullRequest
1 голос
/ 05 сентября 2011

У меня есть XML-документ, который (в основном) выглядит следующим образом:

...
<param>
    <key>age</key>
    <value>10</value>
</param>
<param>
    <key>smart</key>
    <value>true</value>
</param>
...

Я хотел бы ограничить доступные значения на основе ключа параметра, например, age должен быть целым числом в [0, 150] и smart должны быть либо true, либо false.

Теперь, если XML отличается (например, как в примере ниже), это будет очень просто:

...
<age>10</age>
<smart>true</smart>
...

Однако,На этом этапе структура XML не изменится, и я не уверен, что это должно произойти.Есть ли способ реализовать такого рода ограничения в текущей структуре XML, и если да, то как?

ОБНОВЛЕНИЕ:

Судя по (полному отсутствию) обратной связи, я бы сказал, что этоСкорее всего, это невозможно с помощью XSD.Кто-нибудь может подтвердить?

1 Ответ

1 голос
/ 21 октября 2011

Похоже, вам практически нужно определение, которое выглядит примерно так:

  <!-- This is an INVALID example -->
  <xs:element name="param">
    <xs:complexType>
      <xs:choice>
        <xs:sequence>
          <xs:element name="key" type="xs:string" fixed="age" />
          <xs:element name="value" type="xs:decimal" />
        </xs:sequence>
        <xs:sequence>
          <xs:element name="key" type="xs:string" fixed="smart" />
          <xs:element name="value" type="xs:boolean" />
        </xs:sequence>
      </xs:choice>
    </xs:complexType>
  </xs:element>

К сожалению, такой фрагмент кода приводит к неверной схеме XML файла.

Хотя синтаксис правильный, семантика нарушает правила схемы.Элементы с одинаковыми именами и одинаковой областью действия должны иметь одинаковый тип.В этом случае это особенно означает, что все элементы <value>, являющиеся дочерними элементами элементов <param>, должны иметь одинаковый тип.

Формально это Ограничение компонента схемы: согласованные объявления элементов .Смотрите также следующее ограничение компонента схемы;как правило, вы не можете сделать тип элемента зависимым от некоторых других значений в документе или какой-либо информации об элементах в оставшейся части последовательности.возможность получить необходимые ограничения, если вы укажете требуемый тип в документе экземпляра вместо того, чтобы определять его исключительно в схеме.Это можно сделать, добавив атрибут xsi:type к элементам <value>.

Пример

<param>
    <key>age</key>
    <value xsi:type="xs:decimal">10</value>
</param>
<param>
    <key>smart</key>
    <value xsi:type="xs:boolean">true</value>
</param>

Конечно, это немного неудобно, поскольку требует изменения процесса генерации XML.Кроме того, он автоматически не дает никакой гарантии, что <key> и определенное xsi:type совпадают.

...