如何在费用中加入限制

时间:2014-06-08 08:37:06

标签: attributes xsd

这是我的XML。看起来我做了正确的代码,但它似乎仍然无效。我想限制fee,以便它必须有两位十进制数字:

     '<?xml version="1.0" encoding="UTF-8"?>
     <bundle>
     <business type="entertainment">
     <name>Ice Skate Gallery</name>
     <contact>
     <person_name>James Druid</person_name>
     <phone>555-4409129</phone>
     <email>druid@druid.com</email>
     <address>
     <street>1149, southwest avenue </street>
     <zip>890610</zip>
     <state>CA</state>'

这是我的XSD:

     <?xml version="1.0" encoding="UTF-8"?>
     <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">

     <xs:element name="bundle">
     <xs:complexType >
     <xs:sequence>

     <!--</xs:sequence>
     </xs:complexType>
     </xs:element>

     <xs:complexType name="business">
     <xs:simpleContent>
     <xs:extension base="xs:string">
     <xs:attribute name="type" type="xs:string" use="required"/>
     </xs:extension>
     </xs:simpleContent>-->

     <xs:element name="business"> 
     <xs:complexType> 
     <xs:sequence>

     <!-- <xs:extension base="xs:anyType"/>
     <xs:attribute name="type" type="xs:string"/>
     </xs:complexType>-->

     <xs:element name="name" type="xs:string"/>

     <xs:element name="contact">
     <xs:complexType>
     <xs:all>
     <xs:element name="person_name" type="xs:string"/>
     <!--<xs:element name="phone" type="xs:string"/>-->
     <xs:element name="phone">
     <xs:simpleType>
     <xs:restriction base="xs:string">
     <xs:pattern value="\d{3}-\d{7}"/>
     </xs:restriction>
     </xs:simpleType>
     </xs:element>
     <xs:element name="email" type="xs:string"/>
     <xs:element name="address">
     <xs:complexType>
     <xs:all>
     <xs:element name="street" type="xs:string"/>
     <!--<xs:element name="zip" type="xs:string"/>-->
     <xs:element name="zip">
     <xs:simpleType>
     <xs:restriction base="xs:string">
     <xs:minLength value="5"/>
     <xs:maxLength value="6"/>
     </xs:restriction>
     </xs:simpleType>
     </xs:element>

      <!--<xs:element name="state" type="xs:string"/>-->
      <xs:element name="state">
      <xs:simpleType>
      <xs:restriction base="xs:string">
      <xs:length value="2"/>
      </xs:restriction>
      </xs:simpleType>
      </xs:element>


      <xs:element name="country" type="xs:string"/>
      </xs:all>
      </xs:complexType>
      </xs:element>
      </xs:all>
      </xs:complexType>
      </xs:element>

      <!--<xs:element name="admission">
      <xs:complexType>
      <xs:sequence>-->

      <!-- <xs:element name="fee">
      <xs:complexType>
      <xs:simpleContent>
      <xs:extension base="xs:byte">
      <xs:attribute name="currency" type="xs:string" />
      </xs:extension>
      </xs:simpleContent>
      </xs:complexType>
      </xs:element>-->

      <xs:element name="admission">
      <xs:complexType>
      <xs:sequence>
      <xs:element ref="fee"/>
      </xs:sequence>
      <xs:attribute type="xs:string" name="type"/>
      </xs:complexType>
      </xs:element>

      <xs:simpleType name="typeFee">
      <xs:restriction base="xs:decimal">
      <xs:minExclusive value="0"/>
      <xs:fractionDigits value="2"/>
      </xs:restriction>
      </xs:simpleType>
      <xs:element name="fee">
      <xs:complexType>
      <xs:simpleContent>
      <xs:extension base="typeFee">
      <xs:attribute type="xs:string" name="currency" use="required"/>
      </xs:extension>
      </xs:simpleContent>
      </xs:complexType>
      </xs:element>





      </xs:sequence><!--this is for business attribute-->
      <xs:attribute type="xs:string" name="type" use="required"/>
      </xs:complexType>
      </xs:element>

      </xs:sequence>
      </xs:complexType>
      </xs:element>
      </xs:schema>

你能帮我纠正一下吗?

1 个答案:

答案 0 :(得分:0)

我假设您有一个结构良好的XSD,并且您不想在属性中插入限制,如问题标题所示,但为{插入限制{ XML实例中的{1}}元素。

似乎(来自你的代码片段)你试图声明两个元素和一个类型,但是混合了一些东西。让我们从您的<fee>元素开始。它是复杂类型,因为它包含属性和其他元素。它不是简单类型。您可以声明它允许使用admission的{​​{1}}子元素。在序列之后,您可以声明属性:

fee

我在这里使用默认值。如果您未在序列和元素中使用sequence<xs:element name="admission"> <xs:complexType> <xs:sequence> <xs:element ref="fee"/> </xs:sequence> <xs:attribute type="xs:string" name="type"/> </xs:complexType> </xs:element> ,则默认值为1.因此,只允许一个maxOccurs元素。 minOccurs元素作为引用包含在内。这意味着它在模式中的其他位置声明。

<fee>属性声明为fee类型。您可能还想使用枚举值(typexs:string等)或正则表达式来限制它。但这暂时可行。文件验证后,您可以调整架构并根据需要进行调整。

您已经声明了简单类型paid,并且您为其定义的限制是正确的。它会将小数内容限制为大于的数字,而不是零,其中包含2个小数位(因此最小值为not-paid)。您只需将其作为顶级元素(作为typeFee的子元素)放置,以便可以从其他元素中引用它:

0.01

<xs:schema>元素具有简单的内容,但它不是简单类型,因为它具有属性,因此您将其声明为包含简单内容的复杂类型,并且 extend 其类型(这是<xs:simpleType name="typeFee"> <xs:restriction base="xs:decimal"> <xs:minExclusive value="0"/> <xs:fractionDigits value="2"/> </xs:restriction> </xs:simpleType> )以便它允许一个属性:

fee

要验证您的文件,您应该将这三个元素作为typeFee

的子元素
<xs:element name="fee">
    <xs:complexType>
        <xs:simpleContent>
            <xs:extension base="typeFee">
                <xs:attribute type="xs:string" name="currency" use="required"/>
            </xs:extension>
        </xs:simpleContent>
    </xs:complexType>
</xs:element>

您可以节省大量时间阅读XML Schema教程和generating a schema from an instance。生成的模式可能是一个很好的起点,因为至少它会验证您提供的实例,因此您可以将其用作原型来指导模式的开发。但是,有时生成的模式可能会不必要地复杂化。