XSD complexType - ограничить cdata только определенными символами и 2 дочерними элементами

Я уже некоторое время бьюсь головой об стену, и я не ближе к ответу, чем был в начале.

Я пытаюсь создать файл схемы XML, чтобы обеспечить более точную проверку файлов AIML на основе Спецификация AIML 1.0.1, и я столкнулся с проблемой. Согласно спецификации, теги <pattern> и (со стороны ввода) <that> могут допускать только пару дочерних элементов (<bot> и/или <eval>) -или- CDATA, которые могут состоять только из:

  • буквенно-цифровые символы (a-z, A-Z или 0-9)
  • пространства
  • один (или оба) из двух подстановочных знаков ( * или _ )

Примеры допустимых и недопустимых тегов <pattern> могут выглядеть следующим образом:

<!-- valid PATTERN -->
<pattern>HELLO</pattern>
<pattern>HELLO *</pattern>
<pattern>_ IS FOR SALE</pattern>

<!-- invalid PATTERN -->
<pattern>HOW ARE YOU TODAY?</pattern> <!-- note the question mark -->
<pattern>50%</pattern> <!-- note the percent sign -->

Кстати, текущее состояние XSD для тега <pattern> показано ниже и работает, чтобы ограничить CDATA желаемым списком символов:

<xs:element name="pattern">
  <xs:complexType mixed="true">
    <xs:simpleContent>
      <xs:extension base="aiml:InputPatternType">
      </xs:extension>
    </xs:simpleContent>
  </xs:complexType>
</xs:element>

<xs:simpleType name="InputPatternType">
  <xs:restriction base="xs:string">
    <xs:pattern value="[\w| |_|\*]*"/>
  </xs:restriction>
</xs:simpleType>

Однако это не позволяет использовать нужные дочерние элементы, код которых находится здесь:

<xs:choice minOccurs="0" maxOccurs="unbounded">
  <xs:element ref="aiml:bot"/>
  <xs:element ref="aiml:eval"/>
</xs:choice>

Когда я пытаюсь включить этот бит в объявление элемента шаблона, я получаю всевозможные ошибки, в зависимости от того, как я пытаюсь добавить этот код, от «неожиданного дочернего элемента» до жалоб на «если выбрана альтернатива <complexType>. .." и т. д. Я прочитал несколько статей (самая полезная из них - этот, но, как я уже говорил, я не ближе к решению этой проблемы, чем когда начал на прошлой неделе. Я знаю, что просто упускаю что-то простое, но я просто не вижу это, и ни одна из многих статей SO, связанных с этим, не дала мне каких-либо полезных результатов, поскольку они в основном касаются только дочерних элементов, а не того, как ограничить CDATA определенными символами.

Мне хорошо известно, что в приведенном выше коде используются simpleType и simpleContent вместо complexType и complexContent, но мои попытки использовать их не увенчались успехом, поэтому я опубликовал то, что в настоящее время (частично) работает. Любая помощь в этом будет смиренно оценена. Спасибо.


person Dave Morton    schedule 13.06.2016    source источник


Ответы (1)


Дизайн, который вы описываете, не может быть без потерь переведен в модели содержимого XSD: чтобы использовать фасет шаблона для ограничения набора допустимых символов, ваш элемент должен иметь простое содержимое (т. е. простой тип или сложный тип с простым содержимым — сложный, затем , только если он может нести атрибуты); чтобы разрешить дочерним элементам bot и eval, элемент должен иметь сложное содержимое.

Среди ваших вариантов:

  1. Объявите сложный тип со смешанным содержимым, который допускает bot и eval, и используйте утверждения XSD 1.1 для ограничения символов, найденных в содержимом символов.

  2. Определите XML-представление, которое не совсем то, что вы описываете, но которое можно точно проверить и которое соответствует 1:1 тому, что вы описываете: вместо определения одного элемента pattern объявите два с именами input-pattern и bot-eval-pattern (или как угодно). Определите input-pattern как имеющий ваш InputPatternType, а bot-eval-pattern как имеющий сложный тип с необязательным повторяющимся выбором целей: бот и цель: eval.

    При желании вы можете определить абстрактный элемент с именем pattern и назвать его заголовком группы подстановки для двух конкретных элементов input-pattern и bot-eval-pattern; это позволяет другим моделям контента с именем pattern упоминать только pattern вместо упоминания двух конкретных типов.

person C. M. Sperberg-McQueen    schedule 13.06.2016
comment
Спасибо за Ваш ответ. Я проголосовал за него, потому что он дал мне направление для исследований, но, поскольку он на самом деле не помог решить проблему, я не могу принять его как ответ. Я все еще работаю над этим, так что я надеюсь. - person Dave Morton; 18.06.2016
comment
Я должен был включить объяснение в свой комментарий. Извиняюсь. К сожалению, вариант 2 не подходит для этого проекта, так как я работаю в рамках уже существующей спецификации, которая допускает только элемент <pattern> и ничего больше. Вариант 1 возможен, но он выходит за рамки моего текущего опыта, поэтому мне придется узнать немного больше, прежде чем я смогу его реализовать. - person Dave Morton; 18.06.2016