如何在xsd和xsd限制中定义范围

时间:2017-11-06 22:51:12

标签: xml xsd

我目前正在研究xml,xsd和xsl 我有这个问题,我需要将一个id 定义为1000到2000范围内的正整数。该属性是必需的,每个人必须只有一个id。

这是xml

<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<?xml-stylesheet type="text/xsl" href="items.xsl" ?>

<sales>
    <sale>
        <id>1027</id>
        <firstName>Elaine</firstName>
        <lastName>Conner</lastName>
        <street>Ap #177-657 Pede Avenue</street>
        <city>Miller</city>
        <postCode>2143</postCode>
        <salesQuantity>100</salesQuantity>
        <productId>p101</productId>
    </sale>
    <sale>
        <id>1105</id>
        <firstName>Shelby</firstName>
        <lastName>Hinton</lastName>
        <street>P.O. Box 551, 5296 Penatibus Rd</street>
        <city>Granville</city>
        <postCode>2142</postCode>
        <salesQuantity>75</salesQuantity>
        <productId>p201</productId>
    </sale>
    <sale>
        <id>1122</id>
        <firstName>Bryar</firstName>
        <lastName>Weiss</lastName>
        <street>P.O. Box 511, 5053 Ac Avenue</street>
        <city>Campsie</city>
        <postCode>2153</postCode>
        <salesQuantity>150</salesQuantity>
        <productId>p105</productId>
    </sale>
    <sale>
        <id>1037</id>
        <firstName>Slade</firstName>
        <lastName>Haynes</lastName>
        <street>593-252 Nullam Rd</street>
        <city>Lidcombe</city>
        <postCode>2145</postCode>
        <salesQuantity>100</salesQuantity>
        <productId>p101</productId>
    </sale>
</sales>
  1. 如果我使用id得到了正确的话你能告诉我吗?如何在id中创建1000到2000的范围?我在想它的minOccurs和maxOccurs,但这不可能是正确的? maxOccurence是可能的最大“出现”属性,而不是范围,对吧?并且我使用了mimOccurence =“1”,因为每个人必须只有1个身份?

  2. 使用我的productId,我必须设置4个字母数字字符的限制。模式中的值必须是大写字符,后跟3个数字。你能否确认我是否做得对吗?

  3. 这是我正在研究的xsd。

    <?xml version = "1.0"?>
    
    <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
        <xs:element name="sales">
            <xs:complexType>
                <xs:sequence>
                    <xs:element name="sale" type="mySale" minOccurs="1" maxOccurs="unbounded" />
                </xs:sequence>
            </xs:complexType>
        </xs:element>
    
        <xs:complexType name="mySale">
            <xs:sequence>
                <xs:element name="id" type="xs:positiveInteger" minOccurs="1" use="required" />
                <xs:element name="firstName" type="xs:string" use="required" />
                <xs:element name="lastName" type="xs:string" use="required" />
                <xs:element name="street" type="xs:string" />
                <xs:element name="city" type="xs:string" />
                <xs:element name="postCode" type="xs:positiveInteger" use="required" />
                <xs:element name="salesQuantity" type="xs:integer" />
                <xs:element name="productId">
                    <xs:simpleType>
                        <xs:restriction base="xs:string">
                            <xs:pattern value="[A-Z0-90-90-9]{4}" />
                        </xs:restriction>
                    </xs:simpleType>
                </xs:element>
            </xs:sequence>
        </xs:complexType>
    </xs:schema>
    

    提前谢谢

2 个答案:

答案 0 :(得分:0)

  

id定义为1000到2000范围内的正整数。

使用xsd:minInclusivexsd:maxInclusive

  <xsd:simpleType name="Id1000to2000Type">
    <xsd:restriction base="xsd:integer">
      <xsd:minInclusive value="1000"/>
      <xsd:maxInclusive value="2000"/>
    </xsd:restriction>
  </xsd:simpleType>
  

该属性是必需的,每个人必须只有一个id

小心。在XML中,属性意味着非常具体的东西; id此处是元素

<xsd:element name="id" minOccurs="1" maxOccurs="1" type="Id1000to2000Type"/>

请注意,由于minOccurs and maxOccurs are 1的默认值,您可以在上述声明中省略它们。

  

使用我的productId,我必须设置4个字母数字字符的限制。模式中的值必须是大写字符,后跟3个数字。你能否确认我是否做得对吗?

    <xs:pattern value="[A-Z0-90-90-9]{4}" />

不,你的模式会允许大写字母在数字中混合显示,并且不需要存在一个。除了{4}之外,你也不应该重复0-9个范围。

相反,请使用约束的以下等效表达式之一:

     <xs:pattern value="[A-Z][0-9][0-9][0-9]" />
     <xs:pattern value="[A-Z][0-9]{3}" />
     <xs:pattern value="[A-Z]\d{3}" />

答案 1 :(得分:0)

也许你需要多做一些阅读?

对于id属性,将其类型定义为用户定义的类型,该类型是通过xs:integer的限制派生的,具有两个方面:minInclusive和maxInclusive

<xs:simpleType name="IdType">
  <xs:restriction base="xs:integer">
    <xs:minInclusive value="1000"/>
    <xs:maxInclusive value="2000"/>
  </xs:restriction>
</xs:simpleType>

对于productId,您想要的模式是[A-Z][0-9][0-9][0-9]