Esquema XML minOccurs / maxOccurs valores predeterminados

214

Me pregunto cómo maneja la especificación del esquema XML estos casos:

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

No se da maxOccurs -> ¿Es esta la cardinalidad [1..1]?

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

Supongo que esto es simplemente inválido?

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

¿Es esta la cardinalidad [0..2] o [1..2]?

¿Existe una definición "oficial" sobre cómo la especificación del Esquema XML maneja estos casos?

Chris
fuente

Respuestas:

327

Los valores predeterminados para minOccursy maxOccursson 1. Por lo tanto:

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

la cardinalidad es [1-1] Nota: si especifica solo el atributo minOccurs, no puede ser mayor que 1, porque el valor predeterminado para maxOccurs es 1.

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

inválido

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

la cardinalidad es [1-2] Nota: si especifica solo el atributo maxOccurs, no puede ser menor que 1, porque el valor predeterminado para minOccurs es 1.

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

es una combinación válida que hace que el elemento esté prohibido.

Para obtener más información, visite http://www.w3.org/TR/xmlschema-0/#OccurrenceConstraints

jasso
fuente
<xsd: element minOccurs = "0" maxOccurs = "0" /> no funciona en mi caso.
Ashish
44
En ese caso, no defina ese elemento en el xsd
tapasvi
66

Nueva respuesta ampliada a una vieja pregunta común ...

Valores predeterminados

  • Restricciones de ocurrencia minOccursy maxOccurs valor predeterminado para1 .

Casos comunes explicados

<xsd:element name="A"/>

significa Aes obligatorios y deben aparecer exactamente una vez .


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

significa Aes opcional y puede aparecer como máximo una vez .


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

significa Aes requiereny pueden repetirse un número ilimitado de veces .


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

medio A es opcional y puede repetirse un número ilimitado de veces .


Ver también

  • Esquema XML W3C Parte 0: Manual

    En general, se requiere que aparezca un elemento cuando el valor de minOccurs es 1 o más. El número máximo de veces que puede aparecer un elemento está determinado por el valor de un atributo maxOccurs en su declaración. Este valor puede ser un número entero positivo como 41, o el término sin límites para indicar que no hay un número máximo de ocurrencias. El valor predeterminado para los atributos minOccurs y maxOccurs es 1. Por lo tanto, cuando un elemento como el comentario se declara sin un atributo maxOccurs, el elemento no puede aparecer más de una vez. Asegúrese de que si especifica un valor solo para el atributo minOccurs, es menor o igual que el valor predeterminado de maxOccurs, es decir, es 0 o 1. Del mismo modo, si especifica un valor solo para el atributo maxOccurs, debe ser mayor o igual que el valor predeterminado de minOccurs, es decir, 1 o más.

  • Esquema XML W3C Parte 1: Estructuras Segunda edición

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

Respuesta corta:

Como está escrito 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 proporciona un atributo con número, entonces el número es límite. De lo contrario, el atributo debería aparecer exactamente una vez .

Daniel Perník
fuente
-2

ejemplo:

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>

Resultado:

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
fuente
1
Su respuesta no tiene nada que ver con la pregunta formulada. Tal vez lo publicaste en la pregunta incorrecta? En cualquier caso, debe eliminarse. Gracias.
kjhughes