2009-05-31 5 views
1

J'essaie de créer un élément dans un schéma XML de sorte que seuls les éléments (X) HTML standard puissent être utilisés comme enfants. Ce que j'ai essayé est le suivant:Comment faire un élément dans un schéma XML qui permet à un élément HTML comme ses enfants?

<xs:element name="description"> 
    <xs:complexType> 
     <xs:sequence minOccurs="0" maxOccurs="unbounded"> 
      <xs:any namespace="http://www.w3.org/1999/xhtml" /> 
     </xs:sequence> 
    </xs:complexType> 
</xs:element> 

Bien sûr, cela ne fonctionne pas, comme le code XML suivant ne spécifie pas explicitement l'espace de noms:

<description> 
    <p>this is a test</p> 
    <p>this is a <b>bold</b> test</p> 
    <h1>Those were the tests</h1> 
</description> 

Ai-je besoin de préciser l'espace de noms quelque part dans le document, ou puis-je l'obtenir dans le schéma?

Répondre

1

Votre schéma semble correct. Notez que la valeur par défaut de xs: any/@ processContents est stricte, ce qui signifie que vos éléments XHTML seront également validés. Vous devrez donc également avoir un schéma XHTML et l'importer de votre schéma. Vous pouvez utiliser processContents = "lax" dans xs: any pour spécifier que la validation ne sera appliquée que s'il existe un schéma pour ces éléments.

Votre problème est dans l'instance où vous devez spécifier l'espace de noms pour l'élément XHTML. Vous pouvez déclarer l'espace de noms XHTML comme espace de noms par défaut sur chaque élément, par exemple

<p xmlns="http://www.w3.org/1999/xhtml">this is a test</p> 

ou vous pouvez le déclarer lié à un préfixe, h, par exemple, et ensuite utiliser ce préfixe pour qualifier vos éléments XHTML:

<description xmlns:h="http://www.w3.org/1999/xhtml"> 
    <h:p>this is a test</h:p> 
    <h:p>this is a <b>bold</b> test</h:p> 
    <h:h1>Those were the tests</h:h1> 
</description> 

Les DTD ne prennent pas en compte l'espace de noms et les déclarations namepsace ne sont que des attributs, il est donc possible de déclarer un attribut xmlns fixe sur un élément pour le placer automatiquement dans un espace de noms spécifique. Les schémas XML prennent en compte l'espace de noms et vous ne pouvez pas avoir une déclaration d'espace de noms en tant qu'attribut fixe.

2

Je pense que vous devez désactiver le traitement de contenu ainsi:

<xs:any namespace="http://www.w3.org/1999/xhtml" processContents="skip"/> 

Voir section 5.5 dans la spécification de schéma XML (en particulier les exemples)

+0

J'espérais qu'il y avait une meilleure façon que de dire « ignorer ». – Eric

+0

Mais vous devez l'ignorer, car ce n'est pas valide. L'utilisation de l'espace de noms correct n'est pas facultative en XML. –

+0

J'espérais que le schéma puisse indiquer au document xml quel était l'espace de noms. Si je devais explicitement indiquer thenamespace, où le ferais-je? – Eric

Questions connexes