代码之家  ›  专栏  ›  技术社区  ›  char m

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

xsd
  •  12
  • char m  · 技术社区  · 14 年前

    我想说明的是 fieldname freetext 必须始终存在于应用于此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 回复  |  直到 7 年前
        1
  •  22
  •   user871611    7 年前

    有一个 Choice Indicator 在xml schema中,它允许您获取其中一个包含的元素,而不是两个或多个。如果你想要三个中的任何两个,我建议你这样做:

    <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 总是和任何一个 fieldname freetext ,那么这就是答案:

    <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>
    
        2
  •  4
  •   Jeff Walker    14 年前

    所以,你也要 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>
    

    这就是你想要的吗?或者你想要 数据库表名 分开?