0

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

例如,我的 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 方案

谢谢

4

2 回答 2

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>

对于任何一种设计,定义适当的约束都是微不足道的。

于 2014-09-04T13:35:06.323 回答
0

这是一个使用 OP 使用的标签的答案。由于断言测试,它仅适用于 XSD 1.1。

  <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甚至dAY不会检查的值。如果允许它们,则必须扩展断言语句。

可以编写一个长的、非常复杂的断言语句而不是 4 个,但是对于单独的语句,错误消息更有帮助,因为测试的哪个部分失败更容易。

于 2015-06-07T21:13:21.450 回答