在XSD 1.1

时间:2015-06-18 16:24:38

标签: xml xsd

我有以下非常简短的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的名称。

1 个答案:

答案 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列表类型。