XSD用于简单包含属性和文本

时间:2011-03-28 09:45:10

标签: xml validation xsd restriction

如何验证具有属性的元素的文本长度。 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”的长度(也是可能的值) 您能否帮助您了解如何验证代码和文本。 感谢

4 个答案:

答案 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 extensionbase的约束方式为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>