我现在已经用头撞了一下墙了一段时间,而且我的答案比起初时还要接近。
我正在尝试创建一个XML Schema文件,以便根据AIML 1.0.1 specification更准确地验证AIML文件,并且我遇到了麻烦。根据规范,<pattern>
和(输入方)<that>
标记只能允许一些子元素(<bot>
和/或<eval
&gt;) -or - CDATA只能包含:
有效和无效<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 -->
顺便说一下,<pattern>
标签的XSD的当前状态如下,并且用于将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>
当我尝试将此位合并到模式元素的声明中时,我会得到各种错误,具体取决于我尝试添加此代码的方式,来自&#34;意外的子元素&#34;关于&#34;如果选择<complexType>
替代方案的投诉...&#34;等我已经阅读了几篇文章(最有帮助的是this one,但正如我所提到的,上周我开始解决这个问题的时间比我刚开始时更接近。我知道我只是错过了一些简单的东西,但是我无法看到它,而且很多SO文章都没有这给我带来了任何可用的结果,因为它们主要只处理子元素,而不是如何将CDATA限制为某些字符。
我很清楚以上代码使用的是simpleType
和simpleContent
而不是complexType
和complexContent
,但我使用这些代码的努力有根本没有成功,所以我发布了目前(部分)工作的内容。任何有关这方面的帮助都会受到谦卑的赞赏。感谢。
答案 0 :(得分:1)
您描述的设计无法在不丢失的情况下翻译成XSD内容模型:要使用模式构面限制合法字符集,您的元素必须具有简单内容(即简单类型或具有简单内容的复杂类型 - 然后,只有它可以携带属性);要允许子元素bot和eval,元素必须具有复杂的内容。
在您的选项中:
声明具有混合内容的复杂类型,允许使用bot和eval,并使用XSD 1.1断言来约束字符内容中的字符。
定义一个XML表示形式,它不是您所描述的,但可以准确验证,并将1:1映射到您描述的内容:而不是定义单个pattern
元素,声明两个名称input-pattern
和bot-eval-pattern
(或您喜欢的任何内容)。将input-pattern定义为具有InputPatternType,并将bot-eval-pattern定义为具有可选重复选择aiml的复杂类型:bot和aiml:eval。
如果您愿意,可以定义一个名为pattern
的抽象元素,并将其命名为两个具体元素input-pattern和bot-eval-pattern的替换组头;这允许名为pattern
的其他内容模型仅提及pattern
,而不是提及两种具体类型。