Я уже некоторое время бьюсь головой об стену, и я не ближе к ответу, чем был в начале.
Я пытаюсь создать файл схемы 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
, но мои попытки использовать их не увенчались успехом, поэтому я опубликовал то, что в настоящее время (частично) работает. Любая помощь в этом будет смиренно оценена. Спасибо.