<!--
Copyright © 2003-2010 Unicode, Inc. and others. All rights reserved. Distributed under the Terms of Use in http://www.unicode.org/copyright.html.

Permission is hereby granted, free of charge, to any person obtaining a copy of the Unicode data files and any associated documentation (the "Data Files") or Unicode software and any associated documentation (the "Software") to deal in the Data Files or Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, and/or sell copies of the Data Files or Software, and to permit persons to whom the Data Files or Software are furnished to do so, provided that (a) the above copyright notice(s) and this permission notice appear with all copies of the Data Files or Software, (b) both the above copyright notice(s) and this permission notice appear in associated documentation, and (c) there is clear notice in each modified Data File or in the Software as well as in the documentation associated with the Data File(s) or Software that the data or software has been modified.

THE DATA FILES AND SOFTWARE ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS INCLUDED IN THIS NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THE DATA FILES OR SOFTWARE.

Except as contained in this notice, the name of a copyright holder shall not be used in advertising or otherwise to promote the sale, use or other dealings in these Data Files or Software without prior written authorization of the copyright holder.
-->

<!ELEMENT cldrTest ((number | date | zoneFields | collation | likelySubtags)*) >
<!ATTLIST cldrTest version CDATA #REQUIRED>
<!ATTLIST cldrTest base CDATA #REQUIRED>

<!ELEMENT number (result*) >
<!ATTLIST number locales CDATA #IMPLIED>

<!ELEMENT date (result*) >
<!ATTLIST date locales CDATA #IMPLIED>

<!ELEMENT zoneFields (result*) >
<!ATTLIST zoneFields locales CDATA #IMPLIED>

<!ELEMENT collation (result*) >
<!ATTLIST collation locales CDATA #IMPLIED>

<!ELEMENT likelySubtags (result*) >

<!ELEMENT result ( #PCDATA ) >

<!-- common result attributes -->
<!ATTLIST result input CDATA #IMPLIED>
<!ATTLIST result draft NMTOKENS  #IMPLIED> <!-- approved contributed provisional unconfirmed, or any combination -->

<!-- number result attributes -->
<!ATTLIST result numberType (standard | integer | decimal | percent | scientific) #IMPLIED>

<!-- date result attributes -->
<!ATTLIST result dateType (none | short | medium | long | full) #IMPLIED>
<!ATTLIST result timeType (none | short | medium | long | full) #IMPLIED>

<!-- zoneFields result attributes -->
<!ATTLIST result zone CDATA #IMPLIED>
<!ATTLIST result date NMTOKEN #IMPLIED>
<!ATTLIST result field NMTOKEN #IMPLIED>
<!ATTLIST result parse CDATA  #IMPLIED>

<!-- likelySubtags result attributes -->
<!ATTLIST result add NMTOKEN #IMPLIED>
<!ATTLIST result remove NMTOKEN #IMPLIED>

