如何在XML模式中指定必须存在两个字段中的任何一个?

时间:2010-03-26 13:57:08

标签: xsd

我想指定fieldnamefreetext必须始终存在于适用于此XSD的XML文件中。有没有办法做到这一点?

<xs:complexType name="tSome">
<xs:sequence>
  <!-- either one of the two below has to be present. -->
  <xs:element name="fieldname" type="xs:string" />
  <xs:element name="freetext" type="xs:string" />
  <!-- this one below must always be present -->
  <xs:element name="dbtablename" type="xs:string" />
</xs:sequence>
</xs:complexType>

2 个答案:

答案 0 :(得分:23)

XML Schema中有一个Choice Indicator,它允许您获取其中一个包含的元素,但不能包含两个或更多元素。如果你想要3中的任何2,我建议做这样的事情:

<xs:choice>
  <xs:element name="fieldname" type="xs:string" minOccurs="0" maxOccurs="1" />
  <xs:element name="freetext" type="xs:string" minOccurs="0" maxOccurs="1" />
  <xs:element name="dbtablename" type="xs:string" minOccurs="0" maxOccurs="1" />
</xs:choice>
<xs:choice>
  <xs:element name="fieldname" type="xs:string" minOccurs="0" maxOccurs="1" />
  <xs:element name="freetext" type="xs:string" minOccurs="0" maxOccurs="1" />
  <xs:element name="dbtablename" type="xs:string" minOccurs="0" maxOccurs="1" />
</xs:choice>

(也许maxOccurs会阻止您两次选择同一个元素。) 如果这不起作用,我不会想到任何事情。

已编辑:我第一次没有正确理解这个问题。如果您希望dbtablename始终与fieldnamefreetext中的任何一个一起出现,那么这就是答案:

<xs:complexType name="tSome">
<xs:sequence>
  <xs:choice>
    <xs:element name="fieldname" type="xs:string" />
    <xs:element name="freetext" type="xs:string" />
  </xs:choice>
  <xs:element name="dbtablename" type="xs:string" />
</xs:sequence>
</xs:complexType>

答案 1 :(得分:4)

那么,你想要fieldname还是freetext而不是两者?或两者兼而有之?然后dbtablename可选?

这是1或2个元素:

<xs:choice minOccurs="1" maxOccurs="2">
    <xs:element name="fieldname" type="xs:string"/>
    <xs:element name="freetext" type="xs:string"/>
    <xs:element name="dbtablename" type="xs:string"/>
</xs:choice>
这是你想要的吗?或者您希望dbtablename分开吗?