属性断言语法:"string || string || string....." in XSD 1.1

Assertion for attributes with syntax: "string || string || string....." in XSD 1.1

我有以下非常短的 XML 文件:

<objective name="WriteYourPaper">
    <task task="TalkToSupervisor" />
    <task task="AcceptPaperNegatively || AcceptPaperPositively" />
    <task task="TalkToSupervisor || AcceptPaperNegatively || AcceptPaperPositively"" />
</objective>

objective 元素内可以有任意多个 "task" 元素。所以我认为这是在我的 XSD:

中定义它的好方法
<xs:element name="objective " type="objectiveType"/>

<xs:complexType name="objectiveType">
    <xs:sequence>
        <xs:element  minOccurs="0" maxOccurs="unbounded" ref="taskType"/>
    </xs:sequence>
    <xs:attribute name="name" type="xs:string" use="required"/>
</xs:complexType>

<xs:element name="task " type="taskType"/>

<xs:complexType name="taskType">
    <xs:attribute name="task" type="xs:string" use="required"/>
</xs:complexType>

问题如下:正如您在我的示例中看到的那样,可以在 "task" 属性中插入一个必须遵守特殊限制的字符串,我需要一个特殊的断言。它可以是一个简单的字符串 "string" 或由“blankSpaces || blankSpaces 分隔的字符串序列。你能帮我定义断言并告诉我应该把它放在哪里吗?提前致谢!

编辑:不幸的是我刚刚意识到我需要进一步的限制。实际上,"task" 元素中的字符串必须遵循某些标准。我的 XML 有一些 "actions" 和 "staticActions" 的定义如下:

<staticAction name="Study" >
    ...
</staticAction>

<action name="TalkToSupervisor" dialog="DialogWithSupervisor" actor="Supervisor">
    ...
</action>

在那个 "task" 属性中,我需要检查语法 "name (spaces) || (spaces) name (spaces) || ..." 是否遵循每个 name 是动作或静态动作的名称。

XSD 具有列表类型的概念,它允许您将属性描述为包含一系列字符串,每个字符串都必须符合相同的原子类型。不幸的是,列表类型总是对应于白色 space 分隔的字符串列表。如果您想选择不同的分隔符,那么 XSD 没有对该概念的内置支持。您真正需要多少分隔符?

从您的问题中不清楚这组任务名称(例如 "TalkToSupervisor")是否是您想在模式中定义的内容,或者它是否应该是开放式的。假设它是一个开放式列表(允许任何字母序列),您可以使用模式定义您的 || 分隔的属性类型,例如

<xs:simpleType name="taskListType">
  <xs:restriction base="xs:string">
    <xs:pattern value="\s+([A-Za-z]+\s+\|\|\s+)*[A-Za-z]+\s+"/>
  </xs:restriction>
</xs:simpleType>

但我更愿意使用 space 分隔列表并使用 XSD 列表类型。