使用XML Schema的复选框类型的字段

时间:2012-05-02 11:22:27

标签: xml xsd

我有以下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个或多个字段 - 多选)。

任何人都可以帮我解决这个问题吗?

1 个答案:

答案 0 :(得分:2)

当您开始进入“验证逻辑”时,您会遇到XML Schema的限制。 XML Schema无法做到这一点,因此您需要在应用程序的较低层使用XML Schema执行基本验证,并在上层加强XML Schema无法处理的逻辑或move to something with more expressive validation rules

除此之外,我能想到用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>限制)。