简体   繁体   中英

Regular Expression in XML Schema

EDIT: I've tried the recommended regular expression in the id attribute, but am now getting the following error when I try to validate the XSD file: "Error at line 7: Element schema has extra content: element"

Here is the code in question:

<xs:attribute name="id" type="xs:ID" use="required">
          <xs:simpleType>
              <xs:restriction base="xs:string">
                <xs:patterrn value="[X|Y][0-9]{3}"/>
              </xs:restriction>
            </xs:simpleType>
          </xs:attribute>

If I switch it back to the following code it validates just fine:

<xs:attribute name="id" type="xs:ID" use="required"/>

Full XML file:

<?xml version="1.0" encoding="UTF-8"?>
<presentations xmlns="http://www.brett.com/presentations"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.brett.com/presentations presentations.xsd"
>

  <presentation date="2013-07-31" length="PT30M">
    <topic genre="Music">PianoML</topic>
    <presenters>
      <name title="Mr." id="Y258">
        <first>Elvis</first>
        <middle>A</middle>
        <last>Presley </last>
      </name>
      <name title="Miss" id="X365">
        <first>Lady</first>
        <last>Gaga</last>
      </name>
    </presenters>
  </presentation>

    <presentation date="2013-08-05" length="PT35M">
    <topic genre="Science">AlienML</topic>
    <presenters>
         <name title="Mr." id="Y007">
        <first>Will</first>
        <last>Smith</last>
      </name>
      <name title="Mr." id="Y360">
        <first>Tommy</first>
        <first>Lee</first>
        <last>Jones</last>
      </name>
    </presenters>
  </presentation>
</presentations>

Full XSD file:

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns="http://www.brett.com/presentations"
targetNamespace="http://www.brett.com/presentations"
elementFormDefault="qualified">

  <xs:element name="presentations">
    <xs:complexType>
      <xs:sequence minOccurs="0" maxOccurs="unbounded">
        <xs:element ref="presentation"/>
      </xs:sequence>
    </xs:complexType>
  </xs:element>

  <xs:element name="presentation">
    <xs:complexType>
      <xs:sequence>
        <xs:element ref="topic"/>
        <xs:element ref="presenters"/>
      </xs:sequence>
      <xs:attribute name="date" type="xs:date" use="required"/>
      <xs:attribute name="length" type="xs:duration" use="required"/>
    </xs:complexType>
  </xs:element>

  <xs:element name="topic">
    <xs:complexType>
        <xs:attribute name="genre" use="required">
        <xs:simpleType>
          <xs:restriction base="xs:string">
            <xs:enumeration value="ART"/>
            <xs:enumeration value="Music"/>
            <xs:enumeration value="Science"/>
            <xs:enumeration value="Technology"/>
          </xs:restriction>
        </xs:simpleType>
      </xs:attribute>
    </xs:complexType>
  </xs:element>

  <xs:element name="presenters">
    <xs:complexType>
      <xs:sequence minOccurs="1" maxOccurs="unbounded">
        <xs:element ref="name"/>
      </xs:sequence>
    </xs:complexType>
  </xs:element>

  <xs:element name="name">
    <xs:complexType>
      <xs:sequence>
        <xs:sequence minOccurs="1" maxOccurs="unbounded">
          <xs:element ref="first"/>
        </xs:sequence>
        <xs:sequence minOccurs="0" maxOccurs="1">
          <xs:element ref="middle"/>
        </xs:sequence>
        <xs:element ref="last"/>
      </xs:sequence>
      <!-- New changes -->
      <xs:attribute name="id" type="xs:ID" use="required">
      <xs:simpleType>
          <xs:restriction base="xs:string">
            <xs:patterrn value="[X|Y][0-9]{3}"/>
          </xs:restriction>
        </xs:simpleType>
      </xs:attribute>
      <xs:attribute name="title" use="required">
        <xs:simpleType>
          <xs:restriction base="xs:string">
            <xs:enumeration value="Mr."/>
            <xs:enumeration value="Mrs."/>
            <xs:enumeration value="Ms."/>
            <xs:enumeration value="Miss"/>
          </xs:restriction>
        </xs:simpleType>
      </xs:attribute>
    </xs:complexType>
  </xs:element>

  <xs:element name="first" type="xs:string"/>

  <xs:element name="middle" type="xs:string"/>

  <xs:element name="last" type="xs:string"/>

</xs:schema>

The regular expressions in XSD's is slightly different, there is a nice article about it here XML Schema Regular Expressions

What you want is as below.

        <xs:attribute name="id" use="required">
          <xs:simpleType>
            <xs:restriction base="xs:string">
              <xs:pattern value="[X|Y][0-9]{3}" />
            </xs:restriction>
          </xs:simpleType>
        </xs:attribute>

Answer for after EDIT: Below is what you need, note that the xs:ID is on the restriction and not the attribute.

  <xs:attribute name="id" use="required">
    <xs:simpleType>
      <xs:restriction base="xs:ID">
        <xs:pattern value="[X|Y][0-9]{3}" />
      </xs:restriction>
    </xs:simpleType>
  </xs:attribute>

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM