【问题标题】:XML Schema minOccurs / maxOccurs default valuesXML Schema minOccurs / maxOccurs 默认值
【发布时间】:2011-06-16 19:52:21
【问题描述】:

我想知道 XML Schema 规范如何处理这些情况:

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

没有给出 maxOccurs -> 这是基数 [1..1] 吗?

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

我想这根本就无效?

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

这是基数 [0..2] 还是 [1..2]?

是否有关于 XML Schema 规范如何处理这些情况的“官方”定义?

【问题讨论】:

    标签: xml xsd


    【解决方案1】:

    minOccursmaxOccurs 的默认值为 1。因此:

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

    cardinality is [1-1] 注意:如果你指定 only minOccurs 属性,它不能大于 1,因为 maxOccurs 的默认值是 1。

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

    无效

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

    cardinality is [1-2] 注意:如果你指定 only maxOccurs 属性,它不能小于 1,因为 minOccurs 的默认值是 1。

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

    是使元素被禁止的有效组合。

    更多信息见http://www.w3.org/TR/xmlschema-0/#OccurrenceConstraints

    【讨论】:

    • 在我的情况下不起作用。
    • 在这种情况下,不要在 xsd 中定义该元素
    【解决方案2】:

    对旧的常见问题的新扩展答案...

    默认值

    • 出现约束minOccursmaxOccurs 默认为1

    常见案例说明

    <xsd:element name="A"/>
    

    表示A必需并且必须只出现一次


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

    表示A可选并且可能最多出现一次


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

    表示A必需的,并且可以重复无限次


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

    表示A可选并且可以重复无限次


    另见

    • W3C XML Schema Part 0: Primer

      一般来说,当一个元素的值为 minOccurs 为 1 或更多。一个元素可以出现的最大次数 出现由它的 maxOccurs 属性的值决定 宣言。该值可以是正整数,例如 41,或者 term unbounded 表示没有最大出现次数。 minOccurs 和 maxOccurs 属性的默认值 是 1。因此,当一个元素(如注释)被声明时没有 maxOccurs 属性,元素不能出现多次。确定 如果您只为 minOccurs 属性指定一个值,它是 小于或等于 maxOccurs 的默认值,即 0 或 1。 同样,如果只为 maxOccurs 属性指定值,则它必须大于或等于 minOccurs 的默认值, 即1个或更多。如果两个属性都省略,则元素必须 只出现一次。

    • W3C XML Schema Part 1: Structures Second Edition

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

    【讨论】:

      【解决方案3】:

      简答:

      如xsd中所写:

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

      如果你提供一个带有数字的属性,那么数字就是边界。 否则属性应该只出现一次

      【讨论】:

        【解决方案4】:

        示例:

        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>
        

        结果:

        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
        

        【讨论】:

        • 您的回答与所提出的问题无关。也许您将其发布到错误的问题上?无论如何,它应该被删除。谢谢。
        猜你喜欢
        • 1970-01-01
        • 2013-09-09
        • 2012-02-24
        • 1970-01-01
        • 2010-12-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多