7
votes

Schéma XML - un seul élément doit avoir un attribut défini sur true

Comment puis-je définir un attribut booléen qui peut être défini "vrai" seulement dans un élément. Après l'extraicement doit être invalide.

<products>
  <product featured="yes">Prod 1</product>
  <product featured="yes">Prod 2</product>
</products>


1 commentaires

Je ne crois pas que cela soit possible avec le schéma XML.


5 Réponses :


5
votes

Vous ne pouvez pas faire cela avec des schémas XML.

Vous pouvez définir des attributs sur un élément, mais ne les limitez pas à une instance de l'élément.


0 commentaires

4
votes

Vous pouvez ajouter un attribut dans produits indiquant quel produit est présenté.


1 commentaires

@Aoi Karasu: Je pense que ça vérifie que ce n'est certainement pas possible



3
votes

Vous ne pouvez pas faire cela avec xmlschema. Si vous souhaitez spécifier ces contraintes dans un environnement XML, essayez Schematron ( http://www.schematron.com/).


0 commentaires

1
votes

Ma réponse est comme ça, car je ne peux pas encore ajouter de commentaires.

"Vous pouvez ajouter un attribut dans l'élément de produits indiquant quel produit est en vedette."

Cette solution mène à un autre problème: Vérification si l'attribut pointe sur l'élément existant. xxx


1 commentaires

S'assurer que FeatureD_ID Les points d'attribut à un élément existant sont possibles via xs: clé et xs: keyrf . En voir plus ici ( daTypic.com/books/defxmlschema/chapter17.html )



3
votes

Vous pouvez faire ce qui suit ...

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified">
    <xs:element name="products">   
        <xs:complexType>
            <xs:sequence>
                <xs:element name="product" type="productType" maxOccurs="unbounded"/>
            </xs:sequence>
        </xs:complexType>
        <xs:unique name="UniqueFeaturedProduct">
            <xs:selector xpath="product"/>
            <xs:field xpath="@featured"/>
        </xs:unique>
    </xs:element>
    <xs:simpleType name="featuredType">
        <xs:restriction base="xs:string">
            <xs:enumeration value="Yes"/>
        </xs:restriction>
    </xs:simpleType>
    <xs:complexType name="productType">
        <xs:simpleContent>
            <xs:extension base="xs:string">
                <xs:attribute name="featured" type="featuredType" use="optional"/>
            </xs:extension>
        </xs:simpleContent>
    </xs:complexType>
</xs:schema>


0 commentaires