将节点限制为XML模式中的一组值

将节点限制为XML模式中的一组值,xml,validation,xsd,Xml,Validation,Xsd,我正在处理xml文件,其中有许多节点具有以下结构的“辅助数据”: <something> <ID>...</ID> <Description>...</Description> </something> ... ... 对于每个“某物”,只有一些值组是有效的 例如,如果其中一个“something”是,则只有以下两个值有效: <sex> <ID>00</ID> <

我正在处理xml文件,其中有许多节点具有以下结构的“辅助数据”:

<something>
  <ID>...</ID>
  <Description>...</Description>
</something>

...
...
对于每个“某物”,只有一些值组是有效的

例如,如果其中一个“something”是
,则只有以下两个值有效:

<sex>
  <ID>00</ID>
  <Description>male</Description>
<sex>

<sex>
  <ID>01</ID>
  <Description>female</Description>
<sex>

00
男性的
01
女性的
如果是
,则只有以下三个值是可以的:

<state>
  <ID>100</ID>
  <Description>downloaded</Description>
</state>

<state>
  <ID>110</ID>
  <Description>printed</Description>
</state>

<state>
  <ID>120</ID>
  <Description>erased</Description>
</state>

100
下载
110
印刷的
120
抹去
我想使用XML架构验证来拒绝具有无效值的文件,但我尝试的所有操作都失败了:设置根
,并使用组限制继承的
中的值,等等


除了在应用程序级别进行验证之外,您能想出一种解决此问题的方法吗?

ID和描述的约束取决于父元素。您可以以相同的方式使它们的声明依赖于它们的父级,方法是使用
ID
Description
的元素声明:

<xs:element name="state">
  <xs:complexType>
    <xs:sequence>
      <xs:element name="ID" type="state-ID"/>
      <xs:element name="Description" type="state-desc"/>
    </xs:sequence>
  </xs:complexType>
</xs:element>

<xs:element name="sex">
  <xs:complexType>
    <xs:sequence>
      <xs:element name="ID" type="sex-ID"/>
      <xs:element name="Description" type="sex-desc"/>
    </xs:sequence>
  </xs:complexType>
</xs:element>

<xs:simpleType name="state-ID">
  <xs:restriction base="xs:NMTOKEN">
    <xs:enumeration value="100"/>
    <xs:enumeration value="110"/>
    <xs:enumeration value="120"/>
  </xs:restriction>
</xs:simpleType>

<xs:simpleType name="state-desc">
  <xs:restriction base="xs:NMTOKEN">
    <xs:enumeration value="downloaded"/>
    <xs:enumeration value="printed"/>
    <xs:enumeration value="erased"/>
  </xs:restriction>
</xs:simpleType>

<xs:simpleType name="sexID">
  <xs:restriction base="xs:NMTOKEN">
    <xs:enumeration value="00"/>
    <xs:enumeration value="01"/>
  </xs:restriction>
</xs:simpleType>

<xs:simpleType name="sex-desc">
  <xs:restriction base="xs:NMTOKEN">
    <xs:enumeration value="male"/>
    <xs:enumeration value="female"/>
  </xs:restriction>
</xs:simpleType>


请注意,这并没有解决一致性要求:如果我理解您的设计,那么
描述
元素是完全冗余的,所有信息都是通过
ID
传递的,反之亦然。在现实生活中,我会更简单地设计XML:
male
erased
,或者(因为这些看起来是其他对象的属性)更可能是属性:
sex=“male”
<代码>状态=“已擦除”。(如果你想对人类性别使用编码值,你可能应该看看ISO 5218。)

约束每个元素的值范围是很容易的。它使00/male和01/femal有效,但00/male和01/male使硬部分无效。当然,正如你所注意到的,设计是多余的,但它是一个给定的,我必须按照它的原样工作;我不能影响它。为了它,我没有读过ISO5218,但是我的
sex
元素与人类无关。哦,实际上我的文件中有两个以上的元素值。我简化了它,以避免问题中的“噪音”:-)很抱歉回答了错误的问题;我回答了你似乎要问的问题。现在您已经清楚了,我可以建议您在Web上查找XSD中的共生约束;有很多堆栈溢出问题提供了您需要的信息。你帮了大忙。我所需要的只是搜索信息时使用的术语,而你给了我:“共现约束”。我自己永远也找不到它。