<Root>
<Scheduler>
<DateTimeType>DAY</DateTimeType>
<DayOfWeek>Sunday</DayOfWeek> --> TAG IS ALLOWED
</Scheduler>
<Scheduler>
<DateTimeType>MONTH</DateTimeType>
<DayOfWeek>Sunday</DayOfWeek> --> TAG IS NOT ALLOWED
<DayOfMonth>28</DayOfMonth> --> TAG IS ALLOWED
</Scheduler>
<Scheduler>
<DateTimeType>WEEKDAY</DateTimeType>
<DayOfWeek>Sunday</DayOfWeek> --> TAG IS ALLOWED
<TimeOfDay>15:26</TimeOfDay> --> TAG IS ALLOWED
<DayOfMonth>28</DayOfMonth> --> TAG IS NOT ALLOWED
</Scheduler>
<Scheduler>
<DateTimeType>TIME</DateTimeType>
<DayOfWeek>Sunday</DayOfWeek> --> TAG IS NOT ALLOWED
<DayOfMonth>28</DayOfMonth> --> TAG IS NOT ALLOWED
<TimeOfDay>15:26</TimeOfDay> --> TAG IS ALLOWED
</Scheduler>
</Root>
答案 0 :(得分:0)
为什么不使用名为DAY,MONTH,WEEKDAY和TIME的元素,而不是将信息推送到元素的字符内容中?也就是说,如果出于您的目的,有四种不同类型的日期时间数据,为什么要使用相同的名称将它们全部调用?
[附录] OP要求举例。好的,这是一个例子:
<Root>
<Scheduler>
<Day>
<DayOfWeek>Sunday</DayOfWeek>
</Day>
</Scheduler>
<Scheduler>
<DayOfMonth>
<DayOfWeek>Sunday</DayOfWeek>
<DayOfMonth>28</DayOfMonth>
</DayOfMonth>
</Scheduler>
<Scheduler>
<Weekday>
<DayOfWeek>Sunday</DayOfWeek>
<TimeOfDay>15:26</TimeOfDay>
<!--* <DayOfMonth>28</DayOfMonth> not allowed -->
</Weekday>
</Scheduler>
<Scheduler>
<Time>
<!--* Not allowed:
* <DayOfWeek>Sunday</DayOfWeek>
* <DayOfMonth>28</DayOfMonth>
*-->
<TimeOfDay>15:26</TimeOfDay>
</Time>
</Scheduler>
</Root>
另一种选择,结构与OP显示的结构更接近:
<Root>
<Scheduler>
<Day/>
<DayOfWeek>Sunday</DayOfWeek>
</Scheduler>
<Scheduler>
<DayOfMonth/>
<DayOfWeek>Sunday</DayOfWeek>
<DayOfMonth>28</DayOfMonth>
</Scheduler>
<Scheduler>
<Weekday/>
<DayOfWeek>Sunday</DayOfWeek>
<TimeOfDay>15:26</TimeOfDay>
<!--* <DayOfMonth>28</DayOfMonth> not allowed -->
</Scheduler>
<Scheduler>
<Time/>
<!--* Not allowed:
* <DayOfWeek>Sunday</DayOfWeek>
* <DayOfMonth>28</DayOfMonth>
*-->
<TimeOfDay>15:26</TimeOfDay>
</Scheduler>
</Root>
使用任何一种设计,适当的约束都很容易定义。
答案 1 :(得分:0)
以下是使用OP使用的标签的答案。由于断言测试,它仅适用于XSD 1.1。
Ellipse
虽然 <xs:element name="Scheduler">
<xs:complexType>
<xs:sequence>
<xs:element minOccurs="1" maxOccurs="1" name="DateTimeType" type="DateTimeType"/>
<xs:element minOccurs="0" maxOccurs="1" name="DayOfWeek" type="xs:string"/>
<xs:element minOccurs="0" maxOccurs="1" name="DayOfMonth" type="xs:string"/>
<xs:element minOccurs="0" maxOccurs="1" name="TimeOfDay" type="xs:string"/>
</xs:sequence>
<xs:assert test="if (./DateTimeType = 'DAY' and (./DayOfMonth or ./TimeOfDay)) then false() else true() "/>
<xs:assert test="if (./DateTimeType = 'MONTH' and ./DayOfWeek ) then false() else true()"/>
<xs:assert test="if (./DateTimeType = 'WEEKDAY' and ./DayOfMonth) then false() else true()"/>
<xs:assert test="if (./DateTimeType = 'TIME' and (./DayOfWeek or ./DayOfMonth)) then false() else true()"/>
</xs:complexType>
</xs:element>
<xs:simpleType name="DateTimeType">
<xs:restriction base="xs:string">
<xs:enumeration value="DAY"/>
<xs:enumeration value="MONTH"/>
<xs:enumeration value="WEEKDAY"/>
<xs:enumeration value="TIME"/>
</xs:restriction>
</xs:simpleType>
的枚举不是问题的一部分,但我会用它来限制值。没有它,DateTimeType
甚至day
等值都不会被检查。如果允许它们,则必须扩展断言语句。
有可能编写一个冗长,非常复杂的断言语句而不是4,但是对于单个语句,错误消息更有用,因为测试的哪一部分更容易失败。