0

一段时间以来,我一直在用头撞墙,但我并没有比一开始更接近答案。

我正在尝试基于AIML 1.0.1 规范创建一个 XML Schema 文件以允许更准确地验证 AIML 文件,但我遇到了障碍。根据规范,<pattern>and(输入端)<that>标签只能允许几个子元素(<bot>和/或<eval>) -或- CDATA 只能包含:

  • 字母数字字符(az、AZ 或 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 限制为某些字符。

我很清楚上面的代码使用simpleTypeandsimpleContent而不是complexTypeand的事实complexContent,但是我使用这些代码的努力根本没有成功,所以我发布了当前(部分)工作的内容。对此的任何帮助将不胜感激。谢谢。

4

1 回答 1

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不是提及两种具体类型。

于 2016-06-13T14:23:44.420 回答