Validate gefüllt Elemente aber leere Elemente ignorieren
-
26-09-2019 - |
Frage
war Yaneeve so freundlich, mein Schema für mich zu beheben, was viele Probleme verursacht wurde
Dies ist nicht so sehr ein Problem, aber er wäre schön, diese Arbeit zu haben
Einige meiner Elemente sind leer wie eine Mobiltelefonnummer oder Faxnummer.
Ich brauche die Länge des Elements zu überprüfen, um sicherzustellen, sie die richtige Anzahl von Ziffern haben, aber ich mag nicht ein leeres Element validieren
CVC-minLength-gültig: Wert '' mit Länge = ‚0‘ ist nicht facetten gültig respektieren ‚11‘ für Typ minLength 'Mobile'.
CVC-type.3.1.3: Der Wert '' von Element 'conmobile' ist nicht gültig.
Gibt es eine Möglichkeit ich ein leeres Element überspringen und zu validieren es nur, wenn es nicht leer ist?
Mein Beispiel Benutzer in der XML
<member>
<user id="4">
<personal>
<name>Connor Lawson</name>
<sex>Male</sex>
<address1>12 Ash Way</address1>
<address2></address2>
<city>Swindon</city>
<county>Wiltshire</county>
<postcode>SN3 6GS</postcode>
<telephone>01791928119</telephone>
<mobile>07338695664</mobile>
<email>itunestinker@fsmail.co.uk</email>
</personal>
<account>
<username>iTuneStinker</username>
<password>3a1f5fda21a07bfff20c41272bae7192</password>
<userlevel>3</userlevel>
<signupdate>2010-03-26T09:23:50</signupdate>
</account>
</user>
<festival id="1">
<event>
<eventname>Oxford Folk Festival</eventname>
<url>http://www.oxfordfolkfestival.com/</url>
<datefrom>2010-04-07</datefrom>
<dateto>2010-04-09</dateto>
<location>Oxford</location>
<eventpostcode>OX19BE</eventpostcode>
<coords>
<lat>51.735640</lat>
<lng>-1.276136</lng>
</coords>
</event>
<contact>
<conname>Stuart Vincent</conname>
<conaddress1>P.O. Box 642</conaddress1>
<conaddress2></conaddress2>
<concity>Oxford</concity>
<concounty>Bedfordshire</concounty>
<conpostcode>OX13BY</conpostcode>
<contelephone>01865 79073</contelephone>
<conmobile></conmobile>
<fax></fax>
<conemail>stewards@oxfordfolkfestival.com</conemail>
</contact>
</festival>
</member>
und mein neues Schema
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
<xs:simpleType name="postcode">
<xs:restriction base="xs:string">
<xs:minLength value="5"/>
<xs:maxLength value="8"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="telephone">
<xs:restriction base="xs:string">
<xs:minLength value="10"/>
<xs:maxLength value="13"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="mobile">
<xs:restriction base="xs:string">
<xs:minLength value="11"/>
<xs:maxLength value="11"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="password">
<xs:restriction base="xs:string">
<xs:minLength value="32"/>
<xs:maxLength value="32"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="userlevel">
<xs:restriction base="xs:integer">
<xs:enumeration value="1"/>
<xs:enumeration value="2"/>
<xs:enumeration value="3"/>
<xs:enumeration value="4"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="county">
<xs:restriction base="xs:string">
<xs:enumeration value="Bedfordshire"/>
<xs:enumeration value="Berkshire"/>
<xs:enumeration value="Bristol"/>
<xs:enumeration value="Buckinghamshire"/>
<xs:enumeration value="Cambridgeshire"/>
<xs:enumeration value="Cheshire"/>
<xs:enumeration value="Cleveland"/>
<xs:enumeration value="Cornwall"/>
<xs:enumeration value="Cumberland"/>
<xs:enumeration value="Derbyshire"/>
<xs:enumeration value="Devon"/>
<xs:enumeration value="Dorset"/>
<xs:enumeration value="Durham"/>
<xs:enumeration value="East Ridings Of Yorkshire"/>
<xs:enumeration value="Essex"/>
<xs:enumeration value="Gloucestershire"/>
<xs:enumeration value="Hampshire"/>
<xs:enumeration value="Herefordshire"/>
<xs:enumeration value="Hertfordshire"/>
<xs:enumeration value="Huntingdonshire"/>
<xs:enumeration value="Isle Of Man"/>
<xs:enumeration value="Kent"/>
<xs:enumeration value="Lancashire"/>
<xs:enumeration value="Leicestershire"/>
<xs:enumeration value="Lincolnshire"/>
<xs:enumeration value="London"/>
<xs:enumeration value="Middlesex"/>
<xs:enumeration value="Norfolk"/>
<xs:enumeration value="North Yorkshire"/>
<xs:enumeration value="Northamptonshire"/>
<xs:enumeration value="Northumberland"/>
<xs:enumeration value="Nottinghamshire"/>
<xs:enumeration value="Oxfordshire"/>
<xs:enumeration value="Rutland"/>
<xs:enumeration value="Shropshire"/>
<xs:enumeration value="Somerset"/>
<xs:enumeration value="South Yorkshire"/>
<xs:enumeration value="Staffordshire"/>
<xs:enumeration value="Suffolk"/>
<xs:enumeration value="Surrey"/>
<xs:enumeration value="Sussex"/>
<xs:enumeration value="Tyne and Wear"/>
<xs:enumeration value="Warwickshire"/>
<xs:enumeration value="West Yorkshire"/>
<xs:enumeration value="Westmorland"/>
<xs:enumeration value="Wiltshire"/>
<xs:enumeration value="Wirral"/>
<xs:enumeration value="Worcestershire"/>
<xs:enumeration value="Yorkshire"/>
</xs:restriction>
</xs:simpleType>
<xs:element name="folktask">
<xs:complexType>
<xs:sequence>
<xs:element minOccurs="0" maxOccurs="unbounded" ref="member"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="member">
<xs:complexType>
<xs:sequence>
<xs:element ref="user" minOccurs="0" maxOccurs="unbounded"/>
<xs:element ref="festival" minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="user">
<xs:complexType>
<xs:sequence>
<xs:element ref="personal"/>
<xs:element ref="account"/>
</xs:sequence>
<xs:attribute name="id" type="xs:integer"/>
</xs:complexType>
</xs:element>
<xs:element name="personal">
<xs:complexType>
<xs:sequence>
<xs:element ref="name"/>
<xs:element ref="sex"/>
<xs:element ref="address1"/>
<xs:element ref="address2"/>
<xs:element ref="city"/>
<xs:element ref="county"/>
<xs:element ref="postcode"/>
<xs:element ref="telephone"/>
<xs:element ref="mobile"/>
<xs:element ref="email"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="name" type="xs:string"/>
<xs:element name="sex" type="xs:string"/>
<xs:element name="address1" type="xs:string"/>
<xs:element name="address2" type="xs:string"/>
<xs:element name="city" type="xs:string"/>
<xs:element name="county" type="xs:string"/>
<xs:element name="postcode" type="postcode"/>
<xs:element name="telephone" type="telephone"/>
<xs:element name="mobile" type="mobile"/>
<xs:element name="email" type="xs:string"/>
<xs:element name="account">
<xs:complexType>
<xs:sequence>
<xs:element ref="username"/>
<xs:element ref="password"/>
<xs:element ref="userlevel"/>
<xs:element ref="signupdate"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="username" type="xs:string"/>
<xs:element name="password" type="password"/>
<xs:element name="userlevel" type="userlevel"/>
<xs:element name="signupdate" type="xs:dateTime"/>
<xs:element name="festival">
<xs:complexType>
<xs:sequence>
<xs:element ref="event"/>
<xs:element ref="contact"/>
</xs:sequence>
<xs:attribute name="id" type="xs:integer" use="optional"/>
</xs:complexType>
</xs:element>
<xs:element name="event">
<xs:complexType>
<xs:sequence>
<xs:element ref="eventname"/>
<xs:element ref="url"/>
<xs:element ref="datefrom"/>
<xs:element ref="dateto"/>
<xs:element ref="location"/>
<xs:element ref="eventpostcode"/>
<xs:element ref="coords"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="eventname" type="xs:string"/>
<xs:element name="url" type="xs:string"/>
<xs:element name="datefrom" type="xs:date"/>
<xs:element name="dateto" type="xs:date"/>
<xs:element name="location" type="xs:string"/>
<xs:element name="eventpostcode" type="postcode"/>
<xs:element name="coords">
<xs:complexType>
<xs:sequence>
<xs:element ref="lat"/>
<xs:element ref="lng"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="lat" type="xs:decimal"/>
<xs:element name="lng" type="xs:decimal"/>
<xs:element name="contact">
<xs:complexType>
<xs:sequence>
<xs:element ref="conname"/>
<xs:element ref="conaddress1"/>
<xs:element ref="conaddress2"/>
<xs:element ref="concity"/>
<xs:element ref="concounty"/>
<xs:element ref="conpostcode"/>
<xs:element ref="contelephone"/>
<xs:element ref="conmobile"/>
<xs:element ref="fax"/>
<xs:element ref="conemail"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="conname" type="xs:string"/>
<xs:element name="conaddress1" type="xs:string"/>
<xs:element name="conaddress2" type="xs:string"/>
<xs:element name="concity" type="xs:string"/>
<xs:element name="concounty" type="xs:string"/>
<xs:element name="conpostcode" type="postcode"/>
<xs:element name="contelephone" type="telephone"/>
<xs:element name="conmobile" type="mobile"/>
<xs:element name="fax" type="telephone"/>
<xs:element name="conemail" type="xs:string"/>
</xs:schema>
Lösung
ich es geschafft, es zu beheben, indem Sie
von diesem
geändert<xs:simpleType name="telephone">
<xs:restriction base="xs:string">
<xs:minLength value="10"/>
<xs:maxLength value="13"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="telephone">
<xs:union>
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:minLength value="10"/>
<xs:maxLength value="13"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:enumeration value=""/>
</xs:restriction>
</xs:simpleType>
</xs:union>
</xs:simpleType>
Andere Tipps
Haben Sie versucht Muster Einschränkungen? So etwas wie folgt aus:
<xs:simpleType name="telephone">
<xs:restriction base="xs:string">
<xs:pattern value="[0-9]{10,13}|.{0}/>
</xs:restriction>
</xs:simpleType>
. Achtung: nicht getestet mit tatsächlichen XML