我有以下非常简短的XML文件:
<objective name="WriteYourPaper">
<task task="TalkToSupervisor" />
<task task="AcceptPaperNegatively || AcceptPaperPositively" />
<task task="TalkToSupervisor || AcceptPaperNegatively || AcceptPaperPositively"" />
</objective>
在目标元素中可以有我想要的“任务”元素。所以我认为这是在我的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 ”分隔的字符串序列。请你帮我定义断言并告诉我应该放在哪里?提前谢谢!
编辑:不幸的是我刚才意识到我需要进一步的限制。实际上,“任务”元素中的字符串必须遵循某些标准。我的XML定义了一些“actions”和“staticActions”,如下所示:<staticAction name="Study" >
...
</staticAction>
<action name="TalkToSupervisor" dialog="DialogWithSupervisor" actor="Supervisor">
...
</action>
在“task”属性中,我需要检查语法“name( spaces )||( spaces )name( spaces ) )|| ...“后面跟着每个名称是Action或StaticAction的名称。
答案 0 :(得分:1)
XSD具有列表类型的概念,它允许您将属性描述为包含字符串序列,每个字符串必须符合相同的原子类型。不幸的是,列表类型总是对应于以空格分隔的字符串列表。如果要选择其他分隔符,则XSD没有内置的概念支持。你真的需要多少分隔符?
从您的问题中不清楚是否要在模式中定义任务名称集(例如&#34; TalkToSupervisor&#34;),或者它是否应该是开放式的。假设它是一个开放式列表(允许任何字母序列),您可以使用模式定义您的|| - 分离属性类型,例如
<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>
但我更愿意选择以空格分隔的列表并使用XSD列表类型。