xsdnotepad++xmlspy

What is the syntax to define the maxLength facet in XML Schema?


I'm trying to validate an XML schema with several tools, but I'm not getting a consistent message, depending on which tool I use. The following syntax seems to be the issue:

<xs:element name="Name" 
            minOccurs="1" 
            type ="xs:string" 
            maxLength = "125"/>

XML-Spy triggers an error whereas Notepad ++ (windows) and XML Copy Editor (Ubuntu) validate it. So is that syntax correct, or should I use this:

<xs:element name="name">
  <xs:simpleType>
    <xs:restriction base="xs:string">
      <xs:minOccurs="1"/>
      <xs:maxLength = "125"/>
    </xs:restriction>
  </xs:simpleType>
</xs:element>

Solution

  • You ask "So is my syntax correct [in example 1] or should I write [example 2]?"

    Neither.

    In your first example, you use the undeclared maxLength attribute on your xs:element element. (The minOccurs attribute may or may not be allowed, depending on context; as Petru Gardea has already pointed out, it's not legal on top-level element declarations.) The editors which don't raise errors on this are not doing a full job of checking conformance to the XSD schema for schemas (let alone the full constraints of XSD). If you want reliable validation of XSD schema documents, Xerces, Saxon, MSV, or some other conforming XSD implementation is your friend.

    In your second example, minOccurs has ceased to be an attribute on an element declaration (which it can be in some contexts) and become an element (no, wrong) inside xs:restriction (no, wrong). The maxLength facet is correctly represented as an element child of xs:restriction, but the element in your example is not well formed; it seems to be trying to use the element type name as an attribute name. If you delete the erroneous minOccurs element and correct the ill-formed maxLength element, the remaining is a syntactically correct top-level element declaration for Name:

    <xs:element name="name">
      <xs:simpleType>
        <xs:restriction base="xs:string">
          <xs:maxLength value = "125"/>
        </xs:restriction>
      </xs:simpleType>
    </xs:element>