Xml – Why “Namespace ‘http://www.w3.org/XML/1998/namespace’ is not available to be referenced in this schema.”

xmlxsd

In looking at the stanzaerror.xsd from http://xmpp.org/schemas/ in Visual Studio 2010, I'm getting a warning on the following line…

<xs:attribute ref='xml:lang' use='optional'/>

Warning:

Namespace 'http://www.w3.org/XML/1998/namespace' is not available to be referenced in this schema.

This seems like a very basic XML warning – any ideas?

<?xml version='1.0' encoding='UTF-8'?>    
<xs:schema
    xmlns:xs='http://www.w3.org/2001/XMLSchema'
    targetNamespace='urn:ietf:params:xml:ns:xmpp-stanzas'
    xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'
    elementFormDefault='qualified'>

  <xs:element name='bad-request' type='empty'/>
  <xs:element name='conflict' type='empty'/>
  <xs:element name='feature-not-implemented' type='empty'/>
  <xs:element name='forbidden' type='empty'/>
  <xs:element name='gone' type='xs:string'/>
  <xs:element name='internal-server-error' type='empty'/>
  <xs:element name='item-not-found' type='empty'/>
  <xs:element name='jid-malformed' type='empty'/>
  <xs:element name='not-acceptable' type='empty'/>
  <xs:element name='not-allowed' type='empty'/>
  <xs:element name='not-authorized' type='empty'/>
  <xs:element name='payment-required' type='empty'/>
  <xs:element name='policy-violation' type='empty'/>
  <xs:element name='recipient-unavailable' type='empty'/>
  <xs:element name='redirect' type='xs:string'/>
  <xs:element name='registration-required' type='empty'/>
  <xs:element name='remote-server-not-found' type='empty'/>
  <xs:element name='remote-server-timeout' type='empty'/>
  <xs:element name='resource-constraint' type='empty'/>
  <xs:element name='service-unavailable' type='empty'/>
  <xs:element name='subscription-required' type='empty'/>
  <xs:element name='undefined-condition' type='empty'/>
  <xs:element name='unexpected-request' type='empty'/>

  <xs:group name='stanzaErrorGroup'>
    <xs:choice>
      <xs:element ref='bad-request'/>
      <xs:element ref='conflict'/>
      <xs:element ref='feature-not-implemented'/>
      <xs:element ref='forbidden'/>
      <xs:element ref='gone'/>
      <xs:element ref='internal-server-error'/>
      <xs:element ref='item-not-found'/>
      <xs:element ref='jid-malformed'/>
      <xs:element ref='not-acceptable'/>
      <xs:element ref='not-authorized'/>
      <xs:element ref='not-allowed'/>
      <xs:element ref='payment-required'/>
      <xs:element ref='policy-violation'/>
      <xs:element ref='recipient-unavailable'/>
      <xs:element ref='redirect'/>
      <xs:element ref='registration-required'/>
      <xs:element ref='remote-server-not-found'/>
      <xs:element ref='remote-server-timeout'/>
      <xs:element ref='resource-constraint'/>
      <xs:element ref='service-unavailable'/>
      <xs:element ref='subscription-required'/>
      <xs:element ref='undefined-condition'/>
      <xs:element ref='unexpected-request'/>
    </xs:choice>
  </xs:group>

  <xs:element name='text'>
    <xs:complexType>
      <xs:simpleContent>
        <xs:extension base='xs:string'>
          <xs:attribute ref='xml:lang' use='optional'/>
        </xs:extension>
      </xs:simpleContent>
    </xs:complexType>
  </xs:element>    

  <xs:simpleType name='empty'>
    <xs:restriction base='xs:string'>
      <xs:enumeration value=''/>
    </xs:restriction>
  </xs:simpleType>    
</xs:schema>

Best Answer

Just because you don't need to declare the xml namespace for instance documents, doesn't mean the same is true for schemas. I know that seems a bit odd but there it is. You need to define the xml:lang attribute and you need to declare the xml namespace. Generally, I use a simple schema that I import into my schemas. Use the one that the W3C has made available.

Import that, declare the namespace. All will be well

<xs:schema
    xmlns:xs='http://www.w3.org/2001/XMLSchema'
    xmlns:xml="http://www.w3.org/XML/1998/namespace" 
    targetNamespace='urn:ietf:params:xml:ns:xmpp-stanzas'
    xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'
    elementFormDefault='qualified'>

    <xs:import schemaLocation="http://www.w3.org/2001/xml.xsd" namespace="http://www.w3.org/XML/1998/namespace"/>

    <xs:element name='bad-request' type='empty'/>
    <xs:element name='conflict' type='empty'/>
    <xs:element name='feature-not-implemented' type='empty'/>
    <xs:element name='forbidden' type='empty'/>
    <xs:element name='gone' type='xs:string'/>
    <xs:element name='internal-server-error' type='empty'/>
    <xs:element name='item-not-found' type='empty'/>
    <xs:element name='jid-malformed' type='empty'/>
    <xs:element name='not-acceptable' type='empty'/>
    <xs:element name='not-allowed' type='empty'/>
    <xs:element name='not-authorized' type='empty'/>
    <xs:element name='payment-required' type='empty'/>
    <xs:element name='policy-violation' type='empty'/>
    <xs:element name='recipient-unavailable' type='empty'/>
    <xs:element name='redirect' type='xs:string'/>
    <xs:element name='registration-required' type='empty'/>
    <xs:element name='remote-server-not-found' type='empty'/>
    <xs:element name='remote-server-timeout' type='empty'/>
    <xs:element name='resource-constraint' type='empty'/>
    <xs:element name='service-unavailable' type='empty'/>
    <xs:element name='subscription-required' type='empty'/>
    <xs:element name='undefined-condition' type='empty'/>
    <xs:element name='unexpected-request' type='empty'/>

    <xs:group name='stanzaErrorGroup'>
        <xs:choice>
            <xs:element ref='bad-request'/>
            <xs:element ref='conflict'/>
            <xs:element ref='feature-not-implemented'/>
            <xs:element ref='forbidden'/>
            <xs:element ref='gone'/>
            <xs:element ref='internal-server-error'/>
            <xs:element ref='item-not-found'/>
            <xs:element ref='jid-malformed'/>
            <xs:element ref='not-acceptable'/>
            <xs:element ref='not-authorized'/>
            <xs:element ref='not-allowed'/>
            <xs:element ref='payment-required'/>
            <xs:element ref='policy-violation'/>
            <xs:element ref='recipient-unavailable'/>
            <xs:element ref='redirect'/>
            <xs:element ref='registration-required'/>
            <xs:element ref='remote-server-not-found'/>
            <xs:element ref='remote-server-timeout'/>
            <xs:element ref='resource-constraint'/>
            <xs:element ref='service-unavailable'/>
            <xs:element ref='subscription-required'/>
            <xs:element ref='undefined-condition'/>
            <xs:element ref='unexpected-request'/>
        </xs:choice>
    </xs:group>

    <xs:element name='text'>
        <xs:complexType>
            <xs:simpleContent>
                <xs:extension base='xs:string'>
                    <xs:attribute ref='xml:lang' use='optional'/>
                </xs:extension>
            </xs:simpleContent>
        </xs:complexType>
    </xs:element>

    <xs:simpleType name='empty'>
        <xs:restriction base='xs:string'>
            <xs:enumeration value=''/>
        </xs:restriction>
    </xs:simpleType>

</xs:schema>

I'm not that familiar with XMPP but I suspect that your schema is intended to be imported into another where the XML namespace will have already been declared.