xsd中的条件值

时间:2014-09-04 06:57:27

标签: xml xsd xsd-validation xsd-1.1

嗨,有没有办法在标签值上添加条件?

例如,我的xml看起来像这样:

<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>

我需要一个允许/不允许我的xml

中的这些条件的XSD Schem

感谢

2 个答案:

答案 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,但是对于单个语句,错误消息更有用,因为测试的哪一部分更容易失败。