这是我的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>
你能帮我纠正一下吗?
答案 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
类型。您可能还想使用枚举值(type
,xs: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。生成的模式可能是一个很好的起点,因为至少它会验证您提供的实例,因此您可以将其用作原型来指导模式的开发。但是,有时生成的模式可能会不必要地复杂化。