2013-08-31 1 views
1

J'ai des problèmes avec l'affectation d'un attribut à un complexType dans mon schéma XML. une version de réduire mon schéma est ci-dessous:XML Schema ComplexType Attribut Ref

<?xml version="1.0"?> 

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    targetNamespace="http://xml-test.com" 
    xmlns="http://xml-test.com" 
    elementFormDefault="qualified"> 

    <!--++++++++++ ELEMENT DEFINTIONS ++++++++++--> 

<xs:element name="DataRoot" type="RootDataType"/> 

<!--++++++++++ TYPE DEFINTIONS ++++++++++--> 

<!-- Document Root --> 
<xs:complexType name="RootDataType"> 
    <xs:sequence minOccurs="1" maxOccurs="unbounded"> 
     <xs:element name="ValueSet" type="ValuesType"/> 
    </xs:sequence> 

    <!-- Attributes --> 
    <xs:attribute name="index" type="xs:integer" use="required"/> 
</xs:complexType> 

<!-- Value Set Type: A type representing a series of data values --> 
<xs:complexType name="ValuesType"> 
    <xs:sequence minOccurs="1" maxOccurs="1"> 
     <xs:element name="FishCount" type="FishCountType"/> 
    </xs:sequence>   

    <!-- Attributes --> 
    <xs:attribute name="catcher" type="xs:string" use="required"/> 
</xs:complexType> 


<!-- Simple Fish Count type --> 
<xs:simpleType name="SimpleFishCountType"> 
    <xs:restriction base="xs:decimal"> 
     <xs:totalDigits value="3"/> 
     <xs:fractionDigits value="1"/> 
    </xs:restriction> 
</xs:simpleType> 

<!-- Fish Count type --> 
<xs:complexType name="FishCountType"> 
    <xs:simpleContent> 
     <xs:extension base="SimpleFishCountType"> 
       <xs:attribute ref="interpolation"/> 
     </xs:extension>       
    </xs:simpleContent>     
</xs:complexType> 

<!--++++++++++ ATTRIBUTE DEFINTIONS ++++++++++--> 

<!-- Attribute to specify interpolation method --> 
<xs:attribute name="interpolation"> 
    <xs:simpleType> 
     <xs:restriction base="xs:integer"> 
     <xs:minInclusive value="0"/> 
     <xs:maxInclusive value="1"/> 
    </xs:restriction> 
    </xs:simpleType> 
</xs:attribute> 

Une explication: J'ai un élément « dataroot », qui peut contenir 1 ou plusieurs « éléments » ValueSet. Mon type ValueSet contient un élément, FishCount, qui est un type complexe, FishCountType. FishCountType est composé du type simple SimpleFishCount, qui est basé sur un nombre décimal avec des restrictions, et un attribut, "interpolation".

Le fichier XML de test J'utilise est ci-dessous:

<?xml version="1.0"?> 

<DataRoot index="1" 
      xmlns="http://xml-test.com" 
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
      xsi:schemaLocation="http://xml-test.com test-001.xsd"> 

    <ValueSet catcher="CaptainBirdsEye"> 
     <FishCount interpolation="0">12.3</FishCount> 
    </ValueSet> 
</DataRoot> 

En utilisant ce validateur: http://www.utilities-online.info/xsdvalidation/#.UiC9UpK0KSo

Je vois que les deux XSD et XML sont valides et bien formé, mais lors de la validation du XML contre le XSD, je reçois cette erreur:

Not valid. 
Error - Line 9, 36: org.xml.sax.SAXParseException; lineNumber: 9; columnNumber: 36; cvc-complex-type.3.2.2: Attribute 'interpolation' is not allowed to appear in element 'FishCount'. 

Il semble que la référence à l'attribut « interpolation » dans « FishCountType » est en quelque sorte incorrect, mais je ne peux pas figu re it out. Si je définis l'attribut d'interpolation en ligne dans le type FishCountType et le change en xs: integer, tout fonctionne bien.

Qu'est-ce que je fais mal ici? Puis-je utiliser un attribut personnalisé de cette manière?

Toute aide appréciée, je me suis gratté la tête presque chauve.

RESOLU grâce à Kay @ Michael

C'est ce que je suis allé avec:

<xs:attributeGroup name="interpolation"> 
     <xs:attribute name="interpolation"> 
     <xs:simpleType> 
      <xs:restriction base="xs:integer"> 
      <xs:minInclusive value="0"/> 
      <xs:maxInclusive value="1"/> 
      </xs:restriction> 
     </xs:simpleType> 
     </xs:attribute> 
    </xs:attributeGroup> 

Répondre

2

Il est une question d'espace de noms. Vous avez déclaré que l'interpolation est dans l'espace de noms cible du schéma.

La solution de contournement habituelle à ce problème si vous souhaitez réutiliser des définitions d'attribut consiste à déclarer l'attribut à l'aide d'une déclaration locale dans un groupe d'attributs global. En tant que déclaration locale, il est alors (par défaut) dans aucun espace de noms.