XSD complexType-将cdata限制为只能包含某些字符和2个子元素



我已经用这个撞墙了一段时间了,现在我离答案并不比一开始更近了。

我正试图创建一个XMLSchema文件,以便根据AIML1.0.1规范对AIML文件进行更准确的验证,但我遇到了一个障碍。根据规范,<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 -->

顺便说一句,<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>

当我试图将这个位合并到模式元素的声明中时,我会收到各种各样的错误,这取决于我试图添加这个代码的方式,从"意外的子元素"到抱怨"如果选择了<complexType>替代方案…"等等。我读了几篇文章(最有帮助的是这篇文章,但正如我所提到的,我离解决这个问题并不比上周刚开始的时候更近。我知道我只是错过了一些简单的东西,但我就是看不到,而且与此相关的许多SO文章都没有给我带来任何可用的结果,因为它们大多只涉及子元素,而不是如何将CDATA限制为某些字符。

我很清楚上面的代码使用simpleTypesimpleContent而不是complexTypecomplexContent,但我使用这些代码的努力根本没有成功,所以我发布了目前(部分)有效的代码。如有任何帮助,我们将不胜感激。谢谢

您描述的设计无法毫无损失地转换为XSD内容模型:要使用模式方面来限制合法字符集,您的元素必须具有简单内容(即简单类型或具有简单内容的复杂类型——复杂,那么,仅当它可以携带属性时);要允许使用子元素bot和eval,元素必须具有复杂的内容。

您的选择:

  1. 声明一个混合内容的复杂类型,该类型允许bot和eval,并使用XSD 1.1断言来约束字符内容中的字符。

  2. 定义一个XML表示,该表示并不完全是您所描述的,但可以准确验证,并且可以1:1映射到您所描述:声明两个名为input-patternbot-eval-pattern(或您喜欢的任何内容),而不是定义一个pattern元素。将输入模式定义为具有InputPatternType,将bot-eval模式定义为拥有复杂类型,并可选重复选择aiml:bot和aiml:eval。

    如果您愿意,您可以定义一个名为pattern的抽象元素,并将其命名为两个具体元素input模式和bot eval模式的替换组头;这允许命名为CCD_ 16的其他内容模型仅提及CCD_。

相关内容

最新更新