XSD complexType - 将cdata限制为仅限某些字符和2个子元素

时间:2016-06-13 09:40:43

标签: xml xsd restriction complextype aiml

我现在已经用头撞了一下墙了一段时间,而且我的答案比起初时还要接近。

我正在尝试创建一个XML Schema文件,以便根据AIML 1.0.1 specification更准确地验证AIML文件,并且我遇到了麻烦。根据规范,<pattern>和(输入方)<that>标记只能允许一些子元素(<bot>和/或<eval&gt;) -or - CDATA只能包含:

  • 字母数字字符(a-z,A-Z或0-9)
  • 空间
  • 两个&#39;通配符中的一个(或两个)字符(*或_)

有效和无效<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限制为某些字符。

我很清楚以上代码使用的是simpleTypesimpleContent而不是complexTypecomplexContent,但我使用这些代码的努力有根本没有成功,所以我发布了目前(部分)工作的内容。任何有关这方面的帮助都会受到谦卑的赞赏。感谢。

1 个答案:

答案 0 :(得分:1)

您描述的设计无法在不丢失的情况下翻译成XSD内容模型:要使用模式构面限制合法字符集,您的元素必须具有简单内容(即简单类型或具有简单内容的复杂类型 - 然后,只有它可以携带属性);要允许子元素bot和eval,元素必须具有复杂的内容。

在您的选项中:

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

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

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