.net 基于元素值的XSD条件
我遇到一个对象具有3个属性的情况: 1) 行动 2) 身份证 3) 名字.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>
操作
可以是更新
或删除
并且是必需的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
vsremove
)
在某些上下文中,可能需要将元素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
vsremove
)
在某些上下文中,可能需要将元素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>