.net 基于元素值的XSD条件

.net 基于元素值的XSD条件,.net,xml,vb.net,xsd,.net,Xml,Vb.net,Xsd,我遇到一个对象具有3个属性的情况: 1) 行动 2) 身份证 3) 名字 操作可以是更新或删除并且是必需的ID是一个int,是必需的。名称是一个字符串,在Action=Remove时是可选的,在Action=Update时是必需的 我如何在XSD中描述这一点? 谢谢大家! 吉姆 这就是我到目前为止所做的: <s:element name="UpdateAccount"> <s:complexType> <s:sequence>

我遇到一个对象具有3个属性的情况: 1) 行动 2) 身份证 3) 名字

操作
可以是
更新
删除
并且是必需的
ID
是一个int,是必需的。名称是一个字符串,在
Action=Remove
时是可选的,在
Action=Update
时是必需的

我如何在XSD中描述这一点? 谢谢大家!

吉姆

这就是我到目前为止所做的:

   <s:element name="UpdateAccount">
    <s:complexType>
      <s:sequence>
        <s:element minOccurs="0" maxOccurs="1" name="myAccount" type="tns:WSUpdate" />
      </s:sequence>
    </s:complexType>
  </s:element>
  <s:complexType name="WSUpdate">
    <s:sequence>
      <s:element minOccurs="1" maxOccurs="1" name="ID" type="s:int" />
      <s:element minOccurs="1" maxOccurs="1" name="Name" nillable="false" type="s:string" />
      <s:element minOccurs="1" maxOccurs="1" name="action" type="tns:UpdateAction" />
    </s:sequence>
  </s:complexType>
  <s:simpleType name="UpdateAction">
    <s:restriction base="s:string">
      <s:enumeration value="Update" />
      <s:enumeration value="Remove" />
    </s:restriction>
  </s:simpleType>

编辑2012年9月12日美国东部时间上午9:28: 在做了更多的思考之后,我修补了一些东西。这并不是我想要的,但可能已经足够让我的客户接受了。它并没有详细说明条件,但它确实为客户机提供了结构定义。你觉得怎么样

  <s:element name="UpdateAccount">
    <s:complexType>
      <s:sequence>
        <s:choice>
    <s:element minOccurs="0" maxOccurs="1" name="myAccount" type="tns:WSUpdate" />
    <s:element minOccurs="0" maxOccurs="1" name="myAccount" type="tns:WSDelete" />
    </s:choice>
      </s:sequence>
    </s:complexType>
  </s:element>
  <s:complexType name="WSUpdate">
    <s:sequence>
      <s:element minOccurs="1" maxOccurs="1" name="ID" type="s:int" />
      <s:element minOccurs="1" maxOccurs="1" name="Name" nillable="false" type="s:string" />
      <s:element minOccurs="1" maxOccurs="1" name="action" type="tns:UpdateAction" />
    </s:sequence>
  </s:complexType>
  <s:complexType name="WSDelete">
    <s:sequence>
      <s:element minOccurs="1" maxOccurs="1" name="ID" type="s:int" />
      <s:element minOccurs="0" maxOccurs="1" name="Name" nillable="true" type="s:string" />
      <s:element minOccurs="1" maxOccurs="1" name="action" type="tns:UpdateAction" />
    </s:sequence>
  </s:complexType>
  <s:simpleType name="UpdateAction">
    <s:restriction base="s:string">
      <s:enumeration value="Update" />
      <s:enumeration value="Remove" />
    </s:restriction>
  </s:simpleType>


您所描述的情况,即一个属性的规则取决于另一个属性的值,通常被称为“共现约束”,在XSD 1.0中无法做到这一点。XSD 1.1使用一种称为“条件类型分配”的机制完全支持它,但要使用它,您需要采用Saxon或Xerces作为XSD验证器。

您描述的一种情况,即一个属性的规则取决于另一个属性的值,通常称为“共现约束”,在XSD1.0中没有实现这一点的方法。XSD 1.1使用一种称为“条件类型分配”的机制完全支持它,但是要使用它,您需要采用Saxon或Xerces作为XSD验证器。

在XSD 1.0中解决问题的一个简单方法是稍微更改问题的术语:将当前的
WSUpdate
元素替换为同名的抽象元素;定义
Update
删除可替换的
元素。根据需要在
Update
Remove
上将属性声明为可选或必需

在XSD 1.0中,检查这样的条件所需要的只是条件取决于元素名称,而不是元素的其他属性

[2012年9月12日编辑:OP要求提供更完整的示例。]

下面是一个使用抽象元素的简单示例

首先,我们让
UpdateAccount
type引用它的子元素,而不是在本地声明它。这允许其他元素也引用它,并声明它们自己可以替代它

<xs:element name="UpdateAccount">
  <xs:complexType>
    <xs:sequence>
      <xs:element minOccurs="0" maxOccurs="1" 
                  ref="tns:myAccount" />
    </xs:sequence>
  </xs:complexType>
</xs:element>
然后,我们声明了两个具体的元素,它们可以替代
myAccount
,并为它们提供具有适当约束的类型。不再需要
操作
子元素:删除和更新之间的区别现在由元素名称给出(
update
vs
remove



在某些上下文中,可能需要将元素
myAccount
声明为具有命名类型(如原始示例中的
tns:WSUpdate
),并将
update
remove
的类型声明为该类型的限制。这会使示例变得更长、更乏味,因此我满足于在这里提及它。它是否有意义取决于您对维护模式的人员的信任程度,以及您的其他支持模式的工具是否会对信息起到有用的作用。

在XSD 1.0中解决问题的一个简单方法是稍微更改问题的术语:用摘要替换当前的
WSUpdate
元素同名元素;定义
Update
删除可替换的
元素。根据需要在
Update
Remove
上将属性声明为可选或必需

在XSD 1.0中,检查这样的条件所需要的只是条件取决于元素名称,而不是元素的其他属性

[2012年9月12日编辑:OP要求提供更完整的示例。]

下面是一个使用抽象元素的简单示例

首先,我们让
UpdateAccount
type引用它的子元素,而不是在本地声明它。这允许其他元素也引用它,并声明它们自己可以替代它

<xs:element name="UpdateAccount">
  <xs:complexType>
    <xs:sequence>
      <xs:element minOccurs="0" maxOccurs="1" 
                  ref="tns:myAccount" />
    </xs:sequence>
  </xs:complexType>
</xs:element>
然后,我们声明了两个具体的元素,它们可以替代
myAccount
,并为它们提供具有适当约束的类型。不再需要
操作
子元素:删除和更新之间的区别现在由元素名称给出(
update
vs
remove



在某些上下文中,可能需要将元素
myAccount
声明为具有命名类型(如原始示例中的
tns:WSUpdate
),并将
update
remove
的类型声明为该类型的限制。这会使示例变得更长、更乏味,因此我满足于在这里提及它。它是否有意义取决于您对维护模式的人员的信任程度,以及您的其他支持模式的工具是否能够利用这些信息做有用的事情。

我在XSD方面一点也不擅长。你介意根据我上面的示例给我一个XSD示例吗?谢谢你的解释!我在XSD方面一点也不强。你介意根据我上面的示例给我一个XSD示例吗?谢谢你的解释!根据我的经验,您不需要使用XSD来定义元素的情况,只需要简单地定义元素/属性彼此关联的方式,而不考虑它们的值。如果你有一个3 a的情况
<xs:element name="update" type="tns:WSUpdate" 
            substitutionGroup="tns:myAccount"/>
<xs:complexType name="WSUpdate">
  <xs:sequence>
    <xs:element minOccurs="1" maxOccurs="1" 
                name="ID" type="xs:int" />
    <xs:element minOccurs="1" maxOccurs="1" 
                name="Name" nillable="false" type="xs:string" />
  </xs:sequence>
</xs:complexType>

<xs:element name="remove" type="tns:WSDelete" 
            substitutionGroup="tns:myAccount"/>
<xs:complexType name="WSDelete">
  <xs:sequence>
    <xs:element minOccurs="1" maxOccurs="1" 
                name="ID" type="xs:int" />
    <xs:element minOccurs="0" maxOccurs="1" 
                name="Name" 
                nillable="false" type="xs:string" />
  </xs:sequence>
</xs:complexType>