Make database.xml valid
[grauphel.git] / tools / info.xsd
1 <?xml version="1.0"?>
2 <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
3            elementFormDefault="qualified" attributeFormDefault="unqualified">
4
5     <xs:element name="info">
6         <xs:complexType>
7             <xs:sequence>
8                 <xs:element name="id" type="id" minOccurs="1" maxOccurs="1"/>
9                 <xs:element name="name" type="l10n-string" minOccurs="1"
10                             maxOccurs="unbounded"/>
11                 <xs:element name="summary" type="l10n-string" minOccurs="1"
12                             maxOccurs="unbounded"/>
13                 <xs:element name="description" type="l10n-text" minOccurs="1"
14                             maxOccurs="unbounded"/>
15                 <xs:element name="version" type="semver"
16                             minOccurs="1" maxOccurs="1"/>
17                 <xs:element name="licence" type="licence" minOccurs="1"
18                             maxOccurs="unbounded"/>
19                 <xs:element name="author" type="author" minOccurs="1"
20                             maxOccurs="unbounded"/>
21                 <xs:element name="namespace" type="limited-string"
22                             minOccurs="0" maxOccurs="1"/>
23                 <xs:element name="types" type="types" minOccurs="0"
24                             maxOccurs="1"/>
25                 <xs:element name="documentation" type="documentation"
26                             minOccurs="0" maxOccurs="1"/>
27                 <xs:element name="category" type="category" minOccurs="1"
28                             maxOccurs="unbounded"/>
29                 <xs:element name="website" type="url" minOccurs="0"
30                             maxOccurs="1"/>
31                 <xs:element name="discussion" type="url" minOccurs="0"
32                             maxOccurs="1"/>
33                 <xs:element name="bugs" type="url" minOccurs="1"
34                             maxOccurs="1"/>
35                 <xs:element name="repository" type="repository" minOccurs="0"
36                             maxOccurs="1"/>
37                 <xs:element name="screenshot" type="screenshot" minOccurs="0"
38                             maxOccurs="10"/>
39                 <xs:element name="dependencies" type="dependencies"
40                             minOccurs="1" maxOccurs="1"/>
41                 <xs:element name="background-jobs" type="jobs"
42                             minOccurs="0" maxOccurs="1"/>
43                 <xs:element name="repair-steps" type="repair-steps"
44                             minOccurs="0" maxOccurs="1"/>
45                 <xs:element name="two-factor-providers"
46                             type="two-factor-providers"
47                             minOccurs="0" maxOccurs="1"/>
48                 <xs:element name="commands" type="commands"
49                             minOccurs="0" maxOccurs="1"/>
50                 <xs:element name="settings" type="settings" minOccurs="0"
51                             maxOccurs="1"/>
52                 <xs:element name="activity" type="activity" minOccurs="0"
53                             maxOccurs="1"/>
54                 <xs:element name="navigations" type="navigations" minOccurs="0"
55                             maxOccurs="1"/>
56                 <xs:element name="contactsmenu" type="contactsmenu" minOccurs="0"
57                             maxOccurs="1"/>
58                 <xs:element name="collaboration" type="collaboration" minOccurs="0"
59                             maxOccurs="1" />
60                 <xs:element name="sabre" type="sabre" minOccurs="0"
61                             maxOccurs="1" />
62             </xs:sequence>
63         </xs:complexType>
64         <xs:unique name="uniqueNameL10n">
65             <xs:selector xpath="name"/>
66             <xs:field xpath="@lang"/>
67         </xs:unique>
68         <xs:unique name="uniqueSummaryL10n">
69             <xs:selector xpath="summary"/>
70             <xs:field xpath="@lang"/>
71         </xs:unique>
72         <xs:unique name="uniqueDescriptionL10n">
73             <xs:selector xpath="description"/>
74             <xs:field xpath="@lang"/>
75         </xs:unique>
76         <xs:unique name="uniqueLicense">
77             <xs:selector xpath="licence"/>
78             <xs:field xpath="."/>
79         </xs:unique>
80         <xs:unique name="uniqueTypes">
81             <xs:selector xpath="types/type"/>
82             <xs:field xpath="."/>
83         </xs:unique>
84         <xs:unique name="uniqueCategory">
85             <xs:selector xpath="category"/>
86             <xs:field xpath="."/>
87         </xs:unique>
88         <xs:unique name="uniqueDatabase">
89             <xs:selector xpath="dependencies/database"/>
90             <xs:field xpath="."/>
91         </xs:unique>
92         <xs:unique name="uniqueLib">
93             <xs:selector xpath="dependencies/lib"/>
94             <xs:field xpath="."/>
95         </xs:unique>
96         <xs:unique name="uniqueCommand">
97             <xs:selector xpath="dependencies/command"/>
98             <xs:field xpath="."/>
99         </xs:unique>
100     </xs:element>
101
102     <!-- basic types -->
103     <xs:simpleType name="empty-string">
104         <xs:restriction base="xs:string">
105             <xs:maxLength value="0"/>
106         </xs:restriction>
107     </xs:simpleType>
108     <xs:simpleType name="non-empty-string">
109         <xs:restriction base="xs:string">
110             <xs:minLength value="1"/>
111         </xs:restriction>
112     </xs:simpleType>
113     <xs:simpleType name="limited-string">
114         <xs:restriction base="non-empty-string">
115             <xs:maxLength value="256"/>
116         </xs:restriction>
117     </xs:simpleType>
118
119     <xs:complexType name="l10n-text">
120         <xs:simpleContent>
121             <xs:extension base="non-empty-string">
122                 <xs:attribute name="lang" type="l10n-code" default="en"
123                               use="optional"/>
124             </xs:extension>
125         </xs:simpleContent>
126     </xs:complexType>
127     <xs:complexType name="l10n-string">
128         <xs:simpleContent>
129             <xs:restriction base="l10n-text">
130                 <xs:maxLength value="128"/>
131             </xs:restriction>
132         </xs:simpleContent>
133     </xs:complexType>
134
135
136     <xs:simpleType name="l10n-code">
137         <xs:restriction base="xs:string">
138             <xs:enumeration value="af"/>
139             <xs:enumeration value="ar"/>
140             <xs:enumeration value="ast"/>
141             <xs:enumeration value="az"/>
142             <xs:enumeration value="bg"/>
143             <xs:enumeration value="be"/>
144             <xs:enumeration value="bn"/>
145             <xs:enumeration value="br"/>
146             <xs:enumeration value="bs"/>
147             <xs:enumeration value="ca"/>
148             <xs:enumeration value="cs"/>
149             <xs:enumeration value="cy"/>
150             <xs:enumeration value="da"/>
151             <xs:enumeration value="de"/>
152             <xs:enumeration value="el"/>
153             <xs:enumeration value="en"/>
154             <xs:enumeration value="eo"/>
155             <xs:enumeration value="es"/>
156             <xs:enumeration value="es-ar"/>
157             <xs:enumeration value="es-co"/>
158             <xs:enumeration value="es-mx"/>
159             <xs:enumeration value="es-ni"/>
160             <xs:enumeration value="es-ve"/>
161             <xs:enumeration value="et"/>
162             <xs:enumeration value="eu"/>
163             <xs:enumeration value="fa"/>
164             <xs:enumeration value="fi"/>
165             <xs:enumeration value="fr"/>
166             <xs:enumeration value="fy"/>
167             <xs:enumeration value="ga"/>
168             <xs:enumeration value="gd"/>
169             <xs:enumeration value="gl"/>
170             <xs:enumeration value="he"/>
171             <xs:enumeration value="hi"/>
172             <xs:enumeration value="hr"/>
173             <xs:enumeration value="hu"/>
174             <xs:enumeration value="ia"/>
175             <xs:enumeration value="id"/>
176             <xs:enumeration value="io"/>
177             <xs:enumeration value="is"/>
178             <xs:enumeration value="it"/>
179             <xs:enumeration value="ja"/>
180             <xs:enumeration value="ka"/>
181             <xs:enumeration value="kk"/>
182             <xs:enumeration value="km"/>
183             <xs:enumeration value="kn"/>
184             <xs:enumeration value="ko"/>
185             <xs:enumeration value="lb"/>
186             <xs:enumeration value="lt"/>
187             <xs:enumeration value="lv"/>
188             <xs:enumeration value="mk"/>
189             <xs:enumeration value="ml"/>
190             <xs:enumeration value="mn"/>
191             <xs:enumeration value="mr"/>
192             <xs:enumeration value="my"/>
193             <xs:enumeration value="nb"/>
194             <xs:enumeration value="ne"/>
195             <xs:enumeration value="nl"/>
196             <xs:enumeration value="nn"/>
197             <xs:enumeration value="os"/>
198             <xs:enumeration value="pa"/>
199             <xs:enumeration value="pl"/>
200             <xs:enumeration value="pt"/>
201             <xs:enumeration value="pt-br"/>
202             <xs:enumeration value="ro"/>
203             <xs:enumeration value="ru"/>
204             <xs:enumeration value="sk"/>
205             <xs:enumeration value="sl"/>
206             <xs:enumeration value="sq"/>
207             <xs:enumeration value="sr"/>
208             <xs:enumeration value="sr-latn"/>
209             <xs:enumeration value="sv"/>
210             <xs:enumeration value="sw"/>
211             <xs:enumeration value="ta"/>
212             <xs:enumeration value="te"/>
213             <xs:enumeration value="th"/>
214             <xs:enumeration value="tr"/>
215             <xs:enumeration value="tt"/>
216             <xs:enumeration value="udm"/>
217             <xs:enumeration value="uk"/>
218             <xs:enumeration value="ur"/>
219             <xs:enumeration value="vi"/>
220             <xs:enumeration value="zh-hans"/>
221             <xs:enumeration value="zh-hant"/>
222         </xs:restriction>
223     </xs:simpleType>
224
225     <xs:simpleType name="semver">
226         <xs:restriction base="limited-string">
227             <xs:pattern
228                     value="(0|[1-9][0-9]*)\.(0|[1-9][0-9]*)\.(0|[1-9][0-9]*)(\-([0-9A-Za-z-]+(\.[0-9A-Za-z-]+)*))?"/>
229         </xs:restriction>
230     </xs:simpleType>
231
232     <xs:simpleType name="version">
233         <xs:restriction base="limited-string">
234             <xs:pattern value="[0-9]+(\.[0-9]+){0,2}"/>
235         </xs:restriction>
236     </xs:simpleType>
237
238     <xs:simpleType name="url">
239         <xs:restriction base="xs:anyURI">
240             <xs:pattern value="https?://.+"/>
241             <xs:maxLength value="256"/>
242         </xs:restriction>
243     </xs:simpleType>
244
245     <xs:simpleType name="secure-url">
246         <xs:restriction base="xs:anyURI">
247             <xs:pattern value="https://.+"/>
248             <xs:maxLength value="256"/>
249         </xs:restriction>
250     </xs:simpleType>
251
252     <xs:simpleType name="email">
253         <xs:restriction base="limited-string">
254             <xs:pattern value="[^@]+@[^\.]+\..+"/>
255         </xs:restriction>
256     </xs:simpleType>
257
258     <!-- first level elements -->
259     <xs:complexType name="screenshot">
260         <xs:simpleContent>
261             <xs:extension base="secure-url">
262                 <xs:attribute name="small-thumbnail" use="optional"
263                               type="secure-url"/>
264             </xs:extension>
265         </xs:simpleContent>
266     </xs:complexType>
267
268     <xs:simpleType name="id">
269         <xs:restriction base="limited-string">
270             <xs:pattern value="[a-z]+[a-z0-9_]*[a-z0-9]+"/>
271         </xs:restriction>
272     </xs:simpleType>
273
274     <xs:complexType name="author">
275         <xs:simpleContent>
276             <xs:extension base="limited-string">
277                 <xs:attribute name="mail" type="email" use="optional"/>
278                 <xs:attribute name="homepage" type="url" use="optional"/>
279             </xs:extension>
280         </xs:simpleContent>
281     </xs:complexType>
282
283     <xs:complexType name="repository">
284         <xs:simpleContent>
285             <xs:extension base="url">
286                 <xs:attribute name="type" type="vcs" use="optional"
287                               default="git"/>
288             </xs:extension>
289         </xs:simpleContent>
290     </xs:complexType>
291
292     <xs:simpleType name="vcs">
293         <xs:restriction base="xs:string">
294             <xs:enumeration value="git"/>
295             <xs:enumeration value="mercurial"/>
296             <xs:enumeration value="subversion"/>
297             <xs:enumeration value="bzr"/>
298         </xs:restriction>
299     </xs:simpleType>
300
301     <xs:complexType name="types">
302         <xs:sequence>
303             <xs:element name="prelogin" minOccurs="0" maxOccurs="1"/>
304             <xs:element name="filesystem" minOccurs="0" maxOccurs="1"/>
305             <xs:element name="authentication" minOccurs="0" maxOccurs="1"/>
306             <xs:element name="logging" minOccurs="0" maxOccurs="1"/>
307             <xs:element name="dav" minOccurs="0" maxOccurs="1"/>
308             <xs:element name="prevent_group_restriction" minOccurs="0"
309                         maxOccurs="1"/>
310         </xs:sequence>
311     </xs:complexType>
312
313     <xs:simpleType name="category">
314         <xs:restriction base="xs:string">
315             <xs:enumeration value="security"/>
316             <xs:enumeration value="customization"/>
317             <xs:enumeration value="files"/>
318             <xs:enumeration value="integration"/>
319             <xs:enumeration value="monitoring"/>
320             <xs:enumeration value="multimedia"/>
321             <xs:enumeration value="office"/>
322             <xs:enumeration value="organization"/>
323             <xs:enumeration value="social"/>
324             <xs:enumeration value="tools"/>
325             <xs:enumeration value="games"/>
326         </xs:restriction>
327     </xs:simpleType>
328
329     <xs:simpleType name="licence">
330         <xs:restriction base="xs:string">
331             <xs:enumeration value="agpl"/>
332             <xs:enumeration value="mpl"/>
333             <xs:enumeration value="apache"/>
334         </xs:restriction>
335     </xs:simpleType>
336
337     <xs:simpleType name="databases">
338         <xs:restriction base="xs:string">
339             <xs:enumeration value="sqlite"/>
340             <xs:enumeration value="mysql"/>
341             <xs:enumeration value="pgsql"/>
342         </xs:restriction>
343     </xs:simpleType>
344
345     <xs:complexType name="documentation">
346         <xs:sequence>
347             <xs:element name="user" type="url" minOccurs="0" maxOccurs="1"/>
348             <xs:element name="admin" type="url" minOccurs="0" maxOccurs="1"/>
349             <xs:element name="developer" type="url" minOccurs="0"
350                         maxOccurs="1"/>
351         </xs:sequence>
352     </xs:complexType>
353
354     <xs:complexType name="settings">
355         <xs:sequence>
356             <xs:element name="admin" type="php-class" minOccurs="0"
357                         maxOccurs="unbounded"/>
358             <xs:element name="admin-section" type="php-class" minOccurs="0"
359                         maxOccurs="unbounded"/>
360         </xs:sequence>
361     </xs:complexType>
362
363     <xs:complexType name="activity">
364         <xs:sequence>
365             <xs:element name="settings" type="activity-settings" minOccurs="0"
366                         maxOccurs="1"/>
367             <xs:element name="filters" type="activity-filters" minOccurs="0" maxOccurs="1"/>
368             <xs:element name="providers" type="activity-providers" minOccurs="0"
369                         maxOccurs="1"/>
370         </xs:sequence>
371     </xs:complexType>
372
373     <xs:complexType name="activity-settings">
374         <xs:sequence>
375             <xs:element name="setting" type="php-class" minOccurs="1"
376                         maxOccurs="unbounded"/>
377         </xs:sequence>
378     </xs:complexType>
379
380     <xs:complexType name="activity-filters">
381         <xs:sequence>
382             <xs:element name="filter" type="php-class" minOccurs="1"
383                         maxOccurs="unbounded"/>
384         </xs:sequence>
385     </xs:complexType>
386
387     <xs:complexType name="activity-providers">
388         <xs:sequence>
389             <xs:element name="provider" type="php-class" minOccurs="1"
390                         maxOccurs="unbounded"/>
391         </xs:sequence>
392     </xs:complexType>
393
394     <xs:complexType name="navigations">
395         <xs:sequence>
396             <xs:element name="navigation" type="navigation" minOccurs="1"
397                         maxOccurs="unbounded"/>
398         </xs:sequence>
399     </xs:complexType>
400
401     <xs:complexType name="navigation">
402         <xs:sequence>
403             <xs:element name="id" type="id" minOccurs="0" maxOccurs="1"/>
404             <xs:element name="name" type="non-empty-string" minOccurs="1" maxOccurs="1"/>
405             <xs:element name="route" type="route" minOccurs="1" maxOccurs="1"/>
406             <xs:element name="icon" type="xs:anyURI" minOccurs="0" maxOccurs="1"/>
407             <xs:element name="order" type="xs:int" minOccurs="0" maxOccurs="1"/>
408             <xs:element name="type" type="navigation-type" minOccurs="0" maxOccurs="1"/>
409         </xs:sequence>
410         <xs:attribute name="role" type="navigation-role" default="all" use="optional"/>
411     </xs:complexType>
412
413     <xs:simpleType name="navigation-role">
414         <xs:restriction base="xs:string">
415             <xs:enumeration value="all"/>
416             <xs:enumeration value="admin"/>
417         </xs:restriction>
418     </xs:simpleType>
419
420     <xs:simpleType name="navigation-type">
421         <xs:restriction base="xs:string">
422             <xs:enumeration value="link"/>
423             <xs:enumeration value="settings"/>
424         </xs:restriction>
425     </xs:simpleType>
426
427     <xs:simpleType name="route">
428         <xs:restriction base="non-empty-string">
429             <xs:pattern value="[0-9a-zA-Z_]+(\.[0-9a-zA-Z_]+){2}"/>
430         </xs:restriction>
431     </xs:simpleType>
432
433     <xs:complexType name="contactsmenu">
434         <xs:sequence>
435             <xs:element name="provider" type="php-class" minOccurs="1"
436                         maxOccurs="1"/>
437         </xs:sequence>
438     </xs:complexType>
439
440     <xs:complexType name="collaboration">
441         <xs:sequence>
442             <xs:element name="plugins" type="collaboration-plugins" minOccurs="0" maxOccurs="1">
443             </xs:element>
444         </xs:sequence>
445     </xs:complexType>
446
447     <xs:complexType name="collaboration-plugins">
448         <xs:sequence>
449             <xs:element name="plugin" type="collaboration-plugins-plugin" minOccurs="1" maxOccurs="unbounded">
450             </xs:element>
451         </xs:sequence>
452     </xs:complexType>
453
454     <xs:complexType name="collaboration-plugins-plugin">
455         <xs:simpleContent>
456             <xs:extension base="php-class">
457                 <xs:attribute name="type" type="collaboration-plugin-type" use="required"/>
458                 <xs:attribute name="share-type" type="share-type" />
459             </xs:extension>
460         </xs:simpleContent>
461     </xs:complexType>
462
463     <xs:simpleType name="collaboration-plugin-type">
464         <xs:restriction base="xs:string">
465             <xs:enumeration value="collaborator-search"/>
466             <xs:enumeration value="autocomplete-sort"/>
467         </xs:restriction>
468     </xs:simpleType>
469
470     <xs:complexType name="sabre">
471         <xs:sequence>
472             <xs:element name="collections" type="sabre-collections" minOccurs="0" maxOccurs="1"/>
473             <xs:element name="plugins" type="sabre-plugins" minOccurs="0" maxOccurs="1"/>
474         </xs:sequence>
475     </xs:complexType>
476
477     <xs:complexType name="sabre-collections">
478         <xs:sequence>
479             <xs:element name="collection" type="php-class" minOccurs="1" maxOccurs="unbounded"/>
480         </xs:sequence>
481     </xs:complexType>
482
483     <xs:complexType name="sabre-plugins">
484         <xs:sequence>
485             <xs:element name="plugin" type="php-class" minOccurs="1" maxOccurs="unbounded"/>
486         </xs:sequence>
487     </xs:complexType>
488
489     <xs:simpleType name="share-type">
490         <xs:restriction base="xs:string">
491             <xs:enumeration value="SHARE_TYPE_USER"/>
492             <xs:enumeration value="SHARE_TYPE_GROUP"/>
493             <xs:enumeration value="SHARE_TYPE_LINK"/>
494             <xs:enumeration value="SHARE_TYPE_EMAIL"/>
495             <xs:enumeration value="SHARE_TYPE_CONTACT"/>
496             <xs:enumeration value="SHARE_TYPE_REMOTE"/>
497             <xs:enumeration value="SHARE_TYPE_CIRCLE"/>
498             <xs:enumeration value="SHARE_TYPE_GUEST"/>
499         </xs:restriction>
500     </xs:simpleType>
501
502     <!-- dependencies -->
503     <xs:complexType name="dependencies">
504         <xs:sequence>
505             <xs:element name="php" type="php" minOccurs="0" maxOccurs="1"/>
506             <xs:element name="database" type="database" minOccurs="0"
507                         maxOccurs="unbounded"/>
508             <xs:element name="command" type="shell-command" minOccurs="0"
509                         maxOccurs="unbounded"/>
510             <xs:element name="lib" type="min-max-version" minOccurs="0"
511                         maxOccurs="unbounded"/>
512             <xs:element name="owncloud" type="owncloud" minOccurs="0"
513                         maxOccurs="1"/>
514             <xs:element name="nextcloud" type="nextcloud" minOccurs="1"
515                         maxOccurs="1"/>
516         </xs:sequence>
517     </xs:complexType>
518
519     <xs:complexType name="owncloud">
520         <xs:attribute name="min-version" type="version" use="required"/>
521         <xs:attribute name="max-version" type="version" use="optional"/>
522     </xs:complexType>
523
524     <xs:complexType name="nextcloud">
525         <xs:attribute name="min-version" type="version" use="required"/>
526         <xs:attribute name="max-version" type="version" use="required"/>
527     </xs:complexType>
528
529     <xs:simpleType name="shell-command">
530         <xs:restriction base="limited-string">
531             <xs:pattern value="[a-zA-Z\-_]+"/>
532         </xs:restriction>
533     </xs:simpleType>
534
535     <xs:complexType name="min-max-version">
536         <xs:simpleContent>
537             <xs:extension base="limited-string">
538                 <xs:attribute name="min-version" type="version"
539                               use="optional"/>
540                 <xs:attribute name="max-version" type="version"
541                               use="optional"/>
542             </xs:extension>
543         </xs:simpleContent>
544     </xs:complexType>
545
546     <xs:complexType name="database">
547         <xs:simpleContent>
548             <xs:extension base="databases">
549                 <xs:attribute name="min-version" type="version"
550                               use="optional"/>
551                 <xs:attribute name="max-version" type="version"
552                               use="optional"/>
553             </xs:extension>
554         </xs:simpleContent>
555     </xs:complexType>
556
557     <xs:complexType name="php">
558         <xs:simpleContent>
559             <xs:extension base="empty-string">
560                 <xs:attribute name="min-int-size" type="bits" use="optional"
561                               default="32"/>
562                 <xs:attribute name="min-version" type="version"
563                               use="optional"/>
564                 <xs:attribute name="max-version" type="version"
565                               use="optional"/>
566             </xs:extension>
567         </xs:simpleContent>
568     </xs:complexType>
569
570     <xs:simpleType name="bits">
571         <xs:restriction base="xs:int">
572             <xs:enumeration value="32"/>
573             <xs:enumeration value="64"/>
574         </xs:restriction>
575     </xs:simpleType>
576
577     <xs:complexType name="repair-steps">
578         <xs:sequence>
579             <xs:element name="pre-migration" type="steps" minOccurs="0"
580                         maxOccurs="1"/>
581             <xs:element name="post-migration" type="steps" minOccurs="0"
582                         maxOccurs="1"/>
583             <xs:element name="live-migration" type="steps" minOccurs="0"
584                         maxOccurs="1"/>
585             <xs:element name="install" type="steps" minOccurs="0"
586                         maxOccurs="1"/>
587             <xs:element name="uninstall" type="steps" minOccurs="0"
588                         maxOccurs="1"/>
589         </xs:sequence>
590     </xs:complexType>
591
592     <xs:complexType name="jobs">
593         <xs:sequence>
594             <xs:element name="job" type="php-class" minOccurs="1"
595                         maxOccurs="unbounded"/>
596         </xs:sequence>
597     </xs:complexType>
598
599     <xs:complexType name="steps">
600         <xs:sequence>
601             <xs:element name="step" type="php-class" minOccurs="1"
602                         maxOccurs="unbounded"/>
603         </xs:sequence>
604     </xs:complexType>
605
606     <xs:complexType name="two-factor-providers">
607         <xs:sequence>
608             <xs:element name="provider" type="php-class" minOccurs="1"
609                         maxOccurs="unbounded"/>
610         </xs:sequence>
611     </xs:complexType>
612
613     <xs:complexType name="commands">
614         <xs:sequence>
615             <xs:element name="command" type="php-class" minOccurs="1"
616                         maxOccurs="unbounded"/>
617         </xs:sequence>
618     </xs:complexType>
619
620     <xs:simpleType name="php-class">
621         <xs:restriction base="xs:string">
622             <xs:pattern
623                     value="[a-zA-Z_][0-9a-zA-Z_]*(\\[a-zA-Z_][0-9a-zA-Z_]*)*"/>
624         </xs:restriction>
625     </xs:simpleType>
626
627 </xs:schema>