Valeurs par défaut du schéma XML minOccurs / maxOccurs

214

Je me demande comment la spécification du schéma XML gère ces cas:

<xsd:element minOccurs="1" name="asdf"/>

Pas de maxOccurs donné -> Est-ce la cardinalité [1..1]?

<xsd:element minOccurs="5" maxOccurs="2" name="asdf"/>

Je suppose que c'est tout simplement invalide?

<xsd:element maxOccurs="2" name="asdf"/>

Est-ce la cardinalité [0..2] ou [1..2]?

Existe-t-il une définition "officielle" de la façon dont la spécification du schéma XML gère ces cas?

Chris
la source

Réponses:

327

Les valeurs par défaut pour minOccurset maxOccurssont 1. Ainsi:

<xsd:element minOccurs="1" name="asdf"/>

la cardinalité est [1-1] Remarque: si vous spécifiez uniquement l' attribut minOccurs, il ne peut pas être supérieur à 1, car la valeur par défaut de maxOccurs est 1.

<xsd:element minOccurs="5" maxOccurs="2" name="asdf"/>

invalide

<xsd:element maxOccurs="2" name="asdf"/>

la cardinalité est [1-2] Remarque: si vous spécifiez uniquement l' attribut maxOccurs, il ne peut pas être inférieur à 1, car la valeur par défaut de minOccurs est 1.

<xsd:element minOccurs="0" maxOccurs="0"/>

est une combinaison valide qui rend l'élément interdit.

Pour plus d'informations, voir http://www.w3.org/TR/xmlschema-0/#OccurrenceConstraints

jasso
la source
<xsd: element minOccurs = "0" maxOccurs = "0" /> ne fonctionne pas dans mon cas.
ashish
4
Dans ce cas, ne définissez pas cet élément dans le xsd
tapasvi
66

Nouvelle réponse élargie à une ancienne question fréquemment posée ...

Les valeurs par défaut

  • Contraintes d'occurrence minOccurset maxOccurs valeur par défaut1 .

Cas courants expliqués

<xsd:element name="A"/>

des moyens Asont requis et doivent apparaître exactement une fois .


<xsd:element name="A" minOccurs="0"/>

Le moyen Aest facultatif et peut apparaître au plus une fois .


 <xsd:element name="A" maxOccurs="unbounded"/>

des moyens Asont nécessaires et peuvent se répéter un nombre illimité de fois .


 <xsd:element name="A" minOccurs="0" maxOccurs="unbounded"/>

Le moyen Aest facultatif et peut se répéter un nombre illimité de fois .


Voir également

  • Schéma XML W3C, partie 0: amorce

    En général, un élément doit apparaître lorsque la valeur de minOccurs est 1 ou plus. Le nombre maximal de fois qu'un élément peut apparaître est déterminé par la valeur d'un attribut maxOccurs dans sa déclaration. Cette valeur peut être un entier positif tel que 41, ou le terme illimité pour indiquer qu'il n'y a pas de nombre maximal d'occurrences. La valeur par défaut pour les attributs minOccurs et maxOccurs est 1. Ainsi, lorsqu'un élément tel que comment est déclaré sans attribut maxOccurs, l'élément ne peut pas apparaître plus d'une fois. Assurez-vous que si vous spécifiez une valeur uniquement pour l'attribut minOccurs, elle est inférieure ou égale à la valeur par défaut de maxOccurs, c'est-à-dire 0 ou 1. De même, si vous spécifiez une valeur uniquement pour l'attribut maxOccurs, elle doit être supérieur ou égal à la valeur par défaut de minOccurs, c'est-à-dire 1 ou plus.

  • Schéma XML du W3C, partie 1: Structures, deuxième édition

    <element
      maxOccurs = (nonNegativeInteger | unbounded)  : 1
      minOccurs = nonNegativeInteger : 1
      >
    
    </element>
kjhughes
la source
0

Réponse courte:

Comme écrit en xsd:

<xs:attribute name="minOccurs" type="xs:nonNegativeInteger" use="optional" default="1"/>
<xs:attribute name="maxOccurs" type="xs:allNNI" use="optional" default="1"/>

Si vous fournissez un attribut avec un nombre, alors le nombre est une limite. Sinon, l'attribut doit apparaître exactement une fois .

Daniel Perník
la source
-2

exemple:

XML

<?xml version="1.0" encoding="UTF-8"?> 
<?xml-stylesheet type="text/xsl" href="country.xsl"?>
<country xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="country.xsd">
    <countryName>Australia</countryName>
    <capital>Canberra</capital>
    <nationalLanguage>English</nationalLanguage>
    <population>21000000</population>
    <currency>Australian Dollar</currency>
    <nationalIdentities>
        <nationalAnthem>Advance Australia Fair</nationalAnthem>
        <nationalDay>Australia Day (26 January)</nationalDay>
        <nationalColour>Green and Gold</nationalColour>
        <nationalGemstone>Opal</nationalGemstone>
        <nationalFlower>Wattle (Acacia pycnantha)</nationalFlower>
    </nationalIdentities>
    <publicHolidays>
        <newYearDay>1 January</newYearDay>
        <australiaDay>26 January</australiaDay>
        <anzacDay>25 April</anzacDay>
        <christmasDay>25 December</christmasDay>
        <boxingDay>26 December</boxingDay>
        <laborDay>Variable Date</laborDay>
        <easter>Variable Date</easter>
        <queenBirthDay>21 April (Variable Date)</queenBirthDay>
    </publicHolidays>
    <states>
        <stateName><Name>NSW -  New South Wales</Name></stateName>
        <stateName><Name>VIC -  Victoria</Name></stateName>
        <stateName><Name>QLD -  Queensland</Name></stateName>
        <stateName><Name>SA -  South Australia</Name></stateName>
        <stateName><Name>WA -  Western Australia</Name></stateName>
        <stateName><Name>TAS -  Tasmania</Name></stateName>
    </states>
    <territories>
        <territoryName>ACT -  Australian Capital Territory</territoryName>
        <territoryName>NT -  Northern Territory</territoryName>
    </territories>
</country>

XSD:

<?xml version="1.0" encoding="UTF-8"?> 
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xs:element name="country">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="countryName" type="xs:string"/>
                <xs:element name="capital" type="xs:string"/>
                <xs:element name="nationalLanguage" type="xs:string"/>
                <xs:element name="population" type="xs:double"/>
                <xs:element name="currency" type="xs:string"/>
                <xs:element name="nationalIdentities">
                <xs:complexType>
                    <xs:sequence>
                        <xs:element name="nationalAnthem" type="xs:string"/>
                        <xs:element name="nationalDay" type="xs:string"/>
                        <xs:element name="nationalColour" type="xs:string"/>
                        <xs:element name="nationalGemstone" type="xs:string"/>
                        <xs:element name="nationalFlower" type="xs:string"/>
                    </xs:sequence>
                </xs:complexType>
                </xs:element>
                <xs:element name="publicHolidays">
                    <xs:complexType>
                        <xs:sequence>
                            <xs:element name="newYearDay" maxOccurs="1" type="xs:string"/>
                            <xs:element name="australiaDay" maxOccurs="1" type="xs:string"/>
                            <xs:element name="anzacDay" maxOccurs="1" type="xs:string"/>
                            <xs:element name="christmasDay" maxOccurs="1" type="xs:string"/>
                            <xs:element name="boxingDay" maxOccurs="1" type="xs:string"/>
                            <xs:element name="laborDay" maxOccurs="1" type="xs:string"/>
                            <xs:element name="easter" maxOccurs="1" type="xs:string"/>
                            <xs:element name="queenBirthDay" maxOccurs="1" type="xs:string"/>
                        </xs:sequence>
                    </xs:complexType>
                </xs:element>
                <xs:element name="states">
                    <xs:complexType>
                        <xs:sequence>
                            <xs:element name="stateName" minOccurs="1" maxOccurs="unbounded">
                                <xs:complexType>
                                    <xs:sequence>
                                        <xs:element name="Name" type="xs:string"/>
                                    </xs:sequence>
                                </xs:complexType>
                            </xs:element>
                        </xs:sequence>
                    </xs:complexType>
                </xs:element>
                <xs:element name="territories">
                    <xs:complexType>
                        <xs:sequence>
                            <xs:element name="territoryName" maxOccurs="unbounded"/>
                        </xs:sequence>
                    </xs:complexType>
                </xs:element>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
</xs:schema>

XSL:

<?xml version="1.0"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
    <xsl:output method="html" indent="yes" version="4.0"/>
    <xsl:template match="/">
        <html>
            <body>          
                <xsl:for-each select="country">         
                    <xsl:value-of select="countryName"/><br/>
                    <xsl:value-of select="capital"/><br/>
                    <xsl:value-of select="nationalLanguage"/><br/>
                    <xsl:value-of select="population"/><br/>
                    <xsl:value-of select="currency"/><br/>              
                    <xsl:for-each select="nationalIdentities">
                        <xsl:value-of select="nationalAnthem"/><br/>
                        <xsl:value-of select="nationalDay"/><br/>
                        <xsl:value-of select="nationalColour"/><br/>
                        <xsl:value-of select="nationalGemstone"/><br/>
                        <xsl:value-of select="nationalFlower"/><br/>
                    </xsl:for-each>
                    <xsl:for-each select="publicHolidays">
                        <xsl:value-of select="newYearDay"/><br/>
                        <xsl:value-of select="australiaDay"/><br/>
                        <xsl:value-of select="anzacDay"/><br/>
                        <xsl:value-of select="christmasDay"/><br/>
                        <xsl:value-of select="boxingDay"/><br/>
                        <xsl:value-of select="laborDay"/><br/>
                        <xsl:value-of select="easter"/><br/>
                        <xsl:value-of select="queenBirthDay"/><br/>
                    </xsl:for-each>
                    <xsl:for-each select="states/stateName">
                        <xsl:value-of select="Name"/><br/>
                    </xsl:for-each>
                </xsl:for-each>
            </body>
        </html>
    </xsl:template>
</xsl:stylesheet>

Résultat:

Australia
Canberra
English
21000000
Australian Dollar
Advance Australia Fair
Australia Day (26 January)
Green and Gold
Opal
Wattle (Acacia pycnantha)
1 January
26 January
25 April
25 December
26 December
Variable Date
Variable Date
21 April (Variable Date)
NSW - New South Wales
VIC - Victoria
QLD - Queensland
SA - South Australia
WA - Western Australia
TAS - Tasmania
Ausra
la source
1
Votre réponse n'a rien à voir avec la question posée. Vous l'avez peut-être posté à la mauvaise question? En tout état de cause, il doit être supprimé. Je vous remercie.
kjhughes