如何验证具有属性的元素的文本长度。 E.g:
<sport code="FB">Football</sport>
现在我需要限制代码属性的可能值(如“FB”,“BB”,“TT”) 我还需要限制文本的可能值和长度(“Football”,“BasketBall”,“TableTennis”)以及这些文本的最大长度(“Football”,“BasketBall”,“TableTennis”)可以20。
我试过
<complexType name="sport">
<simpleContent>
<extension base="string">
<attribute name="code" type="code" />
</extension>
</simpleContent>
</complexType>
<simpleType name="code">
<restriction base="string">
<enumeration value="FB" />
<enumeration value="BB" />
<enumeration value="TT" />
</restriction>
</simpleType>
但是我无法验证文本“Foolball”的长度(也是可能的值) 您能否帮助您了解如何验证代码和文本。 感谢
答案 0 :(得分:13)
我有同样的问题,当我看到有一个接受的答案时,我很有希望。但是,这个答案正是我尝试过的,但我得到了一个架构无效的错误。显然,您不能在simpleContent
内限制complexType
,只能扩展它。此外,您不能在simpleContent
内同时拥有属性和complexType
。在办公室周围的书籍中搜索示例时,我想出了一个修复程序,我已经适应了这个问题,以防将来有人遇到这个问题:
<?xml version="1.0" encoding="ISO-8859-1" ?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:sp="http://www.ckhrysze.net/sports/1.0"
targetNamespace="http://www.ckhrysze.net/sports/1.0"
>
<xsd:element name="sports">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="sport" type="sp:sportType" minOccurs="1" maxOccurs="unbounded" />
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:complexType name="sportType">
<xsd:simpleContent>
<xsd:extension base="sp:sportEnumeration">
<xsd:attribute name="code" type="sp:codeEnumeration" />
</xsd:extension>
</xsd:simpleContent>
</xsd:complexType>
<xsd:simpleType name="sportEnumeration">
<xsd:restriction base="xsd:string">
<xsd:enumeration value="Football" />
<xsd:enumeration value="Basketball" />
</xsd:restriction>
</xsd:simpleType>
<xsd:simpleType name="codeEnumeration">
<xsd:restriction base="xsd:string">
<xsd:enumeration value="FB" />
<xsd:enumeration value="BB" />
</xsd:restriction>
</xsd:simpleType>
</xsd:schema>
答案 1 :(得分:1)
我的元素:
<xsd:element name="From" type="FromType" minOccurs="0" maxOccurs="1"/>
不验证枚举的corractly值接受所有。
<xsd:complexType name="FromType">
<xsd:simpleContent>
<xsd:extension base="FromTypeEnum">
<xsd:attribute name="acronym" type="xsd:string"/>
</xsd:extension>
</xsd:simpleContent>
</xsd:complexType>
<xsd:simpleType name="FromTypeEnum">
<xsd:restriction base="xsd:string">
<xsd:enumeration value="Discard">
<xsd:annotation>
<xsd:documentation>Discard</xsd:documentation>
</xsd:annotation>
</xsd:enumeration>
<xsd:enumeration value="SANDBOX">
<xsd:annotation>
<xsd:documentation>SANDBOX</xsd:documentation>
</xsd:annotation>
</xsd:enumeration>
<xsd:enumeration value="Catalogue">
<xsd:annotation>
<xsd:documentation>Catalogue</xsd:documentation>
</xsd:annotation>
</xsd:enumeration>
<xsd:enumeration value="Current experimentation">
<xsd:annotation>
<xsd:documentation>Current experimentation</xsd:documentation>
</xsd:annotation>
</xsd:enumeration>
<xsd:enumeration value="Current session">
<xsd:annotation>
<xsd:documentation>Current session</xsd:documentation>
</xsd:annotation>
</xsd:enumeration>
<xsd:enumeration value="Restart">
<xsd:annotation>
<xsd:documentation>Restart</xsd:documentation>
</xsd:annotation>
</xsd:enumeration>
</xsd:restriction>
</xsd:simpleType>
答案 2 :(得分:0)
问题的解决方案是创建一个simpleContent
extension
,base
的约束方式为attribute
,<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="sport" type="sportType" />
<xs:complexType name="sportType">
<xs:simpleContent>
<xs:extension base="sportNameType">
<xs:attribute name="code" type="sportCodeType" />
</xs:extension>
</xs:simpleContent>
</xs:complexType>
<xs:simpleType name="sportNameType">
<xs:restriction base="xs:string">
<xs:enumeration value="Football" />
<xs:enumeration value="Basketball" />
<xs:maxLength value="20"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="sportCodeType">
<xs:restriction base="xs:string">
<xs:enumeration value="FB" />
<xs:enumeration value="BB" />
</xs:restriction>
</xs:simpleType>
</xs:schema>
约束另一方。
此 XML架构:
<?xml version="1.0" encoding="UTF-8"?>
<sport code="FB">Football</sport>
正确验证所需的 XML实例文档:
maxLength
注意#1:<?xml version="1.0" encoding="UTF-8"?>
<sport code="BB">Football</sport>
元素满足您的一项要求,但实际上并不是必需的,因为运动名称是枚举的。
注意#2:此架构不强制运动名称和运动代码之间的相关性。换句话说,此架构还验证了此XML:
{{1}}
要解决此问题,您需要使用Schematron或XSD 1.1。
答案 3 :(得分:-1)
元素必须是复杂类型,其中内容基于字符串,并以与属性相同的方式受枚举限制。此外,当您通过枚举进行限制时,这意味着最大长度。
作为旁注,不要对类型和元素/属性使用相同的名称,因为这会令人困惑。
编辑:添加了一个完整的示例:
<element name="sport" type="tns:SportType" />
<complexType name="SportType">
<simpleContent>
<restriction base="string">
<enumeration value="Football" />
<enumeration value="Basketball" />
</restriction>
</simpleContent>
<attribute name="code" type="tns:CodeType" />
</complexType>
<simpleType name="CodeType">
<restriction base="string">
<enumeration value="FB" />
<enumeration value="BB" />
</restriction>
</simpleType>