2013-08-15 3 views
0

Dire que j'ai le document XML suivant:XML Schema: Ignorer les balises avec espace de noms étrangers

<root xmlns:p="uri:myNamespace"> 
    <p:tagA> 
    <p:tagB /> 
    </p:tagA> 
</root> 

Le TAGB ne doit être à l'intérieur d'un tagA. Je peux écrire un XSD qui confirme que:

<xsd:schema ... targetNamespace="uri:myNamespace" elementFormDefault="qualified"> 
    <xsd:element name="tagA"> 
    <xsd:complexType> 
     <xsd:element name="tagB" type="..." /> 
    </xsd:complexType> 
    </xsd:element> 
</xsd:schema> 

Maintenant, voilà le problème: je veux ignorer toutes les balises entre espace de noms étrangers:

<root xmlns:p="uri:myNamespace"> 
    <p:tagA> 
    <whatever /> 
    <foo> 
     <bar> 
     <p:tagB /> 
     </bar> 
    </foo> 
    </p:tagA> 
</root> 

Comme vous pouvez le voir TAGB est maintenant imbriqué dans autres balises sans espace de noms.

Est-il possible (comment?) D'écrire un XSD qui impose toujours que le seul tag au sein de tagA de mon espace de noms est un tagB mais il peut y avoir des balises d'autres espaces de noms entre?

Répondre

0

Les modèles de contenu utilisés dans XSD (et DTD, et Relax NG) pour contraindre le contenu d'un élément définissent des séquences juridiques d'enfants; ils fonctionnent comme une seule règle de production dans une grammaire sans contexte. Il est possible de contraindre les descendants à des niveaux plus profonds, mais cela nécessite une chaîne de déclarations ininterrompue: dans votre exemple, vous avez besoin de déclarations pour foo et bar lorsqu'elles apparaissent dans un élément p:tagA, pour garantir qu'elles contiennent exactement un élément p:tagB. Mais votre point de départ est que vous ne voulez pas contraindre ces éléments. Donc: vous ne pouvez pas utiliser les modèles de contenu pour exprimer la contrainte que vous avez en tête.

Dans XSD 1.1, vous pouvez utiliser une assertion attachée à l'élément p:tagA pour exiger qu'il contienne exactement l'élément p:tagB parmi ses descendants (count(.//p:tagB) eq 1). Vous ne pouvez cependant pas utiliser une assertion attachée à p:tagB pour exiger qu'elle n'apparaisse que dans les éléments p:tagA: les assertions peuvent regarder vers le bas, mais pas vers le haut, dans l'arborescence. (Si vous connaissez le nom d'un conteneur garanti, vous pouvez utiliser une assertion sur ce conteneur qui affirme que chaque élément p: tagB est contenu par l'élément ap: tagA, en utilisant une assertion comme count(.//p:tagA//p:tagB) eq count(.//p:tagB).)

XSD 1.1 est actuellement supporté par certains mais pas tous les valideurs XSD.