【问题标题】:how to define a range in xsd and xsd restrictions如何在 xsd 和 xsd 限制中定义范围
【发布时间】:2017-11-06 22:51:12
【问题描述】:

我目前正在学习 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 个 id??

  2. 使用我的 productId,我必须使用 4 个字母数字字符设置限制。模式中的值必须是大写字符,后跟 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>

提前谢谢你

【问题讨论】:

    标签: xml xsd


    【解决方案1】:

    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 中,attribute 表示非常具体的东西; 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}" />
    

    【讨论】:

      【解决方案2】:

      也许你需要多读一点?

      对于 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]

      【讨论】:

        猜你喜欢
        • 2021-11-07
        • 1970-01-01
        • 1970-01-01
        • 2019-02-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-11-10
        • 1970-01-01
        相关资源
        最近更新 更多