1

我有以下 XSD:

<xsd:complexContent>
    <xsd:extension base="mes:Request">
         <xsd:sequence>
           <xsd:element name="empId" type="xsd:string"/>
           <xsd:element name="empTaskId" type="xsd:int"/>
           <xsd:element name="empStateName" type="xsd:string"/>
           <xsd:element name="empTypeName" type="xsd:string"/>
           <xsd:element name="empActionName" type="xsd:string"/>
           <xsd:element name="empTransactionId" type="xsd:int"/>                               
        </xsd:sequence>
    </xsd:extension>
</xsd:complexContent>

我想要的是只允许从列出的任何字段中选择一个字段作为必填字段<sequence>。我尝试使用<choice>,但它的行为类似于单选按钮;我想要复选框的功能(1 个或多个字段 - 多项选择)。

任何人都可以帮助我实现这一目标吗?

4

1 回答 1

3

当您开始进入“验证逻辑”时,您会遇到 XML Schema 的限制。XML Schema 无法做到这一点,因此您要么需要在应用程序的较低层中使用 XML Schema 执行基本验证,要么在较高层中加强 XML Schema 无法处理的逻辑,或者使用更具表现力的验证规则移动到某些东西.

除此之外,我能想到的最好的使用 XML 模式强制执行您的要求是这样的:

<?xml version="1.0" encoding="utf-8" ?>
<xsd:schema targetNamespace="http://tempuri"
            elementFormDefault="qualified"
            xmlns:t="http://tempuri"
            xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <xsd:element name="Demo">
    <xsd:complexType>
      <xsd:choice minOccurs="1" maxOccurs="6">
        <xsd:element name="empId" type="xsd:string"/>
        <xsd:element name="empTaskId" type="xsd:int"/>
        <xsd:element name="empStateName" type="xsd:string"/>
        <xsd:element name="empTypeName" type="xsd:string"/>
        <xsd:element name="empActionName" type="xsd:string"/>
        <xsd:element name="empTransactionId" type="xsd:int"/>
      </xsd:choice>
    </xsd:complexType>
    <xsd:unique name="unique1">
      <xsd:selector xpath="."/>
      <xsd:field xpath="t:empId"/>
    </xsd:unique>
    <xsd:unique name="unique2">
      <xsd:selector xpath="."/>
      <xsd:field xpath="t:empTaskId"/>
    </xsd:unique>
    <xsd:unique name="unique3">
      <xsd:selector xpath="."/>
      <xsd:field xpath="t:empStateName"/>
    </xsd:unique>
    <xsd:unique name="unique4">
      <xsd:selector xpath="."/>
      <xsd:field xpath="t:empTypeName"/>
    </xsd:unique>
    <xsd:unique name="unique5">
      <xsd:selector xpath="."/>
      <xsd:field xpath="t:empActionName"/>
    </xsd:unique>
    <xsd:unique name="unique6">
      <xsd:selector xpath="."/>
      <xsd:field xpath="t:empTransactionId"/>
    </xsd:unique>
  </xsd:element>
</xsd:schema>

您使用该<choice>元素仅选择一种类型的元素,minOccurs="1"因此您可以拥有至少一种元素并maxOccurs="6"拥有它们。但是现在你可以多次选择相同的元素,所以你必须限制它,这就是<unique>发挥作用的地方。

但请注意,此示例并非没有限制,因为您不能限制元素的顺序(即加强<sequence>限制)。

于 2012-05-06T09:21:45.093 回答