属性断言语法:"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 列表类型。
我有以下非常短的 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 列表类型。