<!-- $Id: metaf.dtd,v 1.33 2007/09/11 12:58:26 metaf2xml Exp $ -->
<!--
########################################################################
# metaf.dtd
#
# copyright (c) metaf2xml 2006-2007
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License as
# published by the Free Software Foundation; either version 2 of the
# License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful, but
# WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
# General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA
########################################################################
-->

<!ENTITY % digit '0|1|2|3|4|5|6|7|8|9'>

<!ENTITY % cloudType 'AC|ACC|ACSL|AS|CB|CBMAM|CC|CCSL|CI|CS|CU|CF|CUFRA|NS|SAC|SC|SCSL|ST|SF|STFRA|TCU'>
<!ENTITY % colourCodes 'BLUplus|BLU|WHT|GRN|YLO|YLO1|YLO2|AMB|RED|FCSTCANCEL'>
<!ENTITY % cloudCover 'FEW|SCT|BKN|OVC'>
<!ENTITY % phenomDescr 'isFrequent|isOccasional|isIntermittent|isContinuous|isThick|isPrettyThick|isVeryThick|isThin|isPrettyThin|isVeryThin|isFeeble|isPrettyFeeble|isVeryFeeble|isLight|isPrettyLight|isVeryLight|isModerate|isHeavy|isVeryHeavy|isLow|isLower|isIsolated|isConvective|isDissipated|inPastHour|baseBelowStation|isAloft|isAround|isFreezing|isPatchy|isVariable'>
<!ENTITY % unitRadiation 'kJmm|Jcmcm'>
<!ENTITY % unitSpeed     'KT|MPS|KMH'>
<!ENTITY % period        '1d|24h|1h|n'>
<!ENTITY % compassDir    'N|NNE|NE|ENE|E|ESE|SE|SSE|S|SSW|SW|WSW|W|WNW|NW|NNW'>

<!ELEMENT data (versionList, options?, reports)>

<!ELEMENT versionList (version+)>
<!ELEMENT version (#PCDATA)>

<!ELEMENT reports ((metar|taf|synop)*)>

<!ELEMENT options (format, lang, mode, msg_metaf, msg_synop, src_metaf, src_synop, type)>
<!ELEMENT format EMPTY>
<!ATTLIST format v (html|text|xml|xml_text) #REQUIRED>
<!ELEMENT lang EMPTY>
<!ATTLIST lang v (de|en|es) #REQUIRED>
<!ELEMENT mode EMPTY>
<!ATTLIST mode v (latest|summary) #REQUIRED>
<!ELEMENT msg_metaf EMPTY>
<!ATTLIST msg_metaf v CDATA #REQUIRED>
<!ELEMENT msg_synop EMPTY>
<!ATTLIST msg_synop v CDATA #REQUIRED>
<!ELEMENT src_metaf EMPTY>
<!ATTLIST src_metaf v (noaa|adds|addsds|file) #REQUIRED>
<!ELEMENT src_synop EMPTY>
<!ATTLIST src_synop v (nws_land|cod|file) #REQUIRED>
<!ELEMENT type EMPTY>
<!ATTLIST type v (metar|taf) #REQUIRED>

<!ELEMENT taf (ERROR?, WARNING?,
               obsStation?, issueTime?, fcstPeriod?, reportModifier?,
               fcstNotAvbl?,
               sfcWind?,
               (CAVOK |
                (visPrev?,
                 weatherList?,
                 cloudList?,
                 visVert?)),
               (turbulence | icing | windShearLvl | QNH)*,
               trendList?,
               (tempAt | tempMaxAt | tempMinAt | correctedAt | amendedAt | limMetwatch | autoMetwatch | amendment)*,
               tafRemarkList?)>
<!ATTLIST taf s CDATA #REQUIRED>

<!ELEMENT synop (ERROR?, WARNING?,
                 obsStationType?,
                 callSign?,
                 obsTime?, reportModifier?,
                 windIndicator?,
                 stationPosition?, stationId?,
                 precipInd?, wxInd?,
                 baseLowestCloud?,
                 visPrev?,
                 visibilityAtLoc?,
                 totalCloudCover?,
                 sfcWind?,
                 temperature?,
                 QNH?,
                 SLPhPa?,
                 pressureChange?,
                 precipHourly?,
                 weatherSynop?,
                 cloudTypes?,
                 exactObsTime?,
                 section3?)>
<!ATTLIST synop s CDATA #REQUIRED>

<!ELEMENT metar (ERROR?, WARNING?, SPECI?,
                 obsStation?, obsTime?, reportModifier?,
                 sfcWind?,
                 (CAVOK |
                  (visPrev?, visMin?, visRwyList?, RVRNO?,
                   weatherList?,
                   cloudList?,
                   visVert?))?,
                 temperature?, QNH?, somePressure?,
                 cloudMaxCover?,
                 recentWeatherList?,
                 windShearList?,
                 rwyStateList?,
                 colourCode?,
                 NEFO_PLAYA?,
                 RH?,
                 windAtLoc?,
                 rwyWindList?,
                 trendList?,
                 remarkList?)>
<!ATTLIST metar  s CDATA #REQUIRED>

<!ELEMENT ERROR (descr, pos)>
<!ELEMENT descr EMPTY>
<!ATTLIST descr v (obsStation|obsTime|fcstPeriod|obsStationType|stationId|callSign|obsTimeWindInd|stationPosition|indicatorCloudVis|cloudWind|invalid333-5xxxx|wind|QNH|other) #REQUIRED>
<!ELEMENT pos   EMPTY>
<!ATTLIST pos   v CDATA #REQUIRED>

<!ELEMENT WARNING (#PCDATA)>

<!ELEMENT SPECI EMPTY>

<!ELEMENT obsStation (id)>
<!ATTLIST obsStation s CDATA #REQUIRED>
<!ELEMENT id EMPTY>
<!ATTLIST id v CDATA #REQUIRED>

<!ELEMENT issueTime (invalidFormat | (day, hour, minute))>
<!ATTLIST issueTime s CDATA #REQUIRED>
<!ELEMENT obsTime (invalidFormat | (day, hour, minute))>
<!ATTLIST obsTime s CDATA #REQUIRED>
<!ELEMENT invalidFormat EMPTY>
<!ATTLIST invalidFormat v CDATA #REQUIRED>
<!ELEMENT day    EMPTY>
<!ATTLIST day    v CDATA #REQUIRED>
<!ELEMENT hour   EMPTY>
<!ATTLIST hour   v CDATA #REQUIRED>
<!ELEMENT minute EMPTY>
<!ATTLIST minute v CDATA #REQUIRED>

<!ELEMENT fcstPeriod (invalidFormat | (day, hourFrom, hourTill)?)>
<!ATTLIST fcstPeriod s CDATA #REQUIRED>
<!ELEMENT hourFrom EMPTY>
<!ATTLIST hourFrom v CDATA #REQUIRED>
<!ELEMENT hourTill EMPTY>
<!ATTLIST hourTill v CDATA #REQUIRED>

<!ELEMENT reportModifier (bulletinSeq?, isLastSegment?,
                          over24hLate?, modifierType, segment?, sequenceLost?)>
<!ATTLIST reportModifier s CDATA #REQUIRED>
<!ELEMENT bulletinSeq    EMPTY>
<!ATTLIST bulletinSeq    v CDATA #REQUIRED>
<!ELEMENT isLastSegment  EMPTY>
<!ELEMENT over24hLate    EMPTY>
<!ELEMENT segment        EMPTY>
<!ATTLIST segment        v CDATA #REQUIRED>
<!ELEMENT sequenceLost   EMPTY>
<!ELEMENT modifierType   EMPTY>
<!ATTLIST modifierType   v (NIL|AUTO|COR|AMD|RTD|P|RR|CC|AA) #REQUIRED>

<!ELEMENT fcstNotAvbl (fcstNotAvblReason)>
<!ATTLIST fcstNotAvbl s CDATA #REQUIRED>
<!ELEMENT fcstNotAvblReason EMPTY>
<!ATTLIST fcstNotAvblReason v (NOOBS|INSUFFICIENTOBS) #REQUIRED>

<!ELEMENT wind ((notAvailable | invalidFormat |
                 (isCalm, isEstimated?) |
                ((dir | dirNotAvailable | dirVariable | dirVarAllUnk),
                 gustSpeed?,
                 isEstimated?,
                 (speedNotAvailable | speed))),
                 (windVarLeft, windVarRight)?)>
<!ELEMENT sfcWind           (wind)>
<!ATTLIST sfcWind           s CDATA #REQUIRED>
<!ELEMENT isCalm            EMPTY>
<!ELEMENT dir               EMPTY>  <!-- true -->
<!ATTLIST dir               v CDATA #REQUIRED>
<!ELEMENT dirNotAvailable   EMPTY>
<!ELEMENT dirVariable       EMPTY>
<!ELEMENT dirVarAllUnk      EMPTY>
<!ELEMENT speedNotAvailable EMPTY>
<!ELEMENT speed             EMPTY>
<!ATTLIST speed             v CDATA         #REQUIRED
                            u (%unitSpeed;) #REQUIRED
                            q (isGreater)   #IMPLIED>
<!ELEMENT gustSpeed         EMPTY>
<!ATTLIST gustSpeed         v CDATA         #REQUIRED
                            u (%unitSpeed;) #REQUIRED
                            q (isGreater)   #IMPLIED>
<!ELEMENT windVarLeft       EMPTY>
<!ATTLIST windVarLeft       v CDATA #REQUIRED>
<!ELEMENT windVarRight      EMPTY>
<!ATTLIST windVarRight      v CDATA #REQUIRED>

<!ELEMENT visPrev (notAvailable | invalidFormat |
                   (NDV?, compassDir?, distance))>
<!ATTLIST visPrev        s CDATA #REQUIRED>
<!ELEMENT notAvailable   EMPTY>
<!ELEMENT compassDir     EMPTY>
<!ATTLIST compassDir     v (%compassDir;) #REQUIRED>
<!ELEMENT distance       EMPTY>
<!ATTLIST distance       v CDATA                             #REQUIRED
                         u (M|KM|SM|FT)                      #REQUIRED
                         q (isLess|isGreater|isEqualGreater) #IMPLIED>
<!ELEMENT NDV            EMPTY>

<!ELEMENT visMin (compassDir?, distance)>
<!ATTLIST visMin s CDATA #REQUIRED>

<!ELEMENT visVert (notAvailable | invalidFormat | (distance))>
<!ATTLIST visVert s CDATA #REQUIRED>

<!ELEMENT visRwyList (visRwy+)>
<!ELEMENT visRwy (invalidFormat | (RVR, RVRVariations?, rwyDesig, visTrend?))>
<!ATTLIST visRwy s CDATA #REQUIRED>
<!ELEMENT RVR (notAvailable | distance)>
<!ELEMENT RVRVariations (distance)>
<!ELEMENT visTrend           EMPTY>
<!ATTLIST visTrend           v (U|D|N) #REQUIRED>

<!ELEMENT RVRNO EMPTY>

<!ELEMENT weatherList (weather+)>
<!ELEMENT weather (  notAvailable | invalidFormat | NSW | tornado
                   | (inVicinity?, phenomDescr?, descriptor*, phenomenon+))>
<!ELEMENT NSW        EMPTY>
<!ELEMENT tornado    EMPTY>
<!ATTLIST weather    s CDATA #REQUIRED>
<!ELEMENT inVicinity EMPTY>
<!ELEMENT descriptor EMPTY>
<!ATTLIST descriptor v (MI|BC|PR|DR|BL|SH|TS|FZ) #REQUIRED>
<!ELEMENT phenomenon EMPTY>
<!ATTLIST phenomenon v CDATA #REQUIRED>

<!ELEMENT cloudList (cloud+)>
<!ELEMENT cloud (notAvailable | invalidFormat | noClouds |
                 ((cloudBase | baseBelowStation)?, cloudCover,
                  (cloudType | cloudTypeNotAvailable)?, isCeiling?))>
<!ATTLIST cloud                 s CDATA #REQUIRED>
<!ELEMENT noClouds              EMPTY>
<!ATTLIST noClouds              v (SKC|NSC|CLR|NCD) #REQUIRED>
<!ELEMENT cloudBase             EMPTY>
<!ATTLIST cloudBase             v CDATA                             #REQUIRED
                                u (M|FT)                            #REQUIRED
                                q (isLess|isGreater|isEqualGreater) #IMPLIED>
<!ELEMENT baseBelowStation      EMPTY>
<!ELEMENT cloudCover            EMPTY>
<!ATTLIST cloudCover            v (%cloudCover;) #REQUIRED>
<!ELEMENT cloudType             EMPTY>
<!ATTLIST cloudType             v (%cloudType;) #REQUIRED>
<!ELEMENT cloudTypeNotAvailable EMPTY>
<!ELEMENT isCeiling             EMPTY>

<!ELEMENT tempMaxAt (hour, temp)>
<!ATTLIST tempMaxAt s CDATA #REQUIRED>
<!ELEMENT tempMinAt (hour, temp)>
<!ATTLIST tempMinAt s CDATA #REQUIRED>

<!ELEMENT tempAt (hour, temp)>
<!ATTLIST tempAt s CDATA #REQUIRED>

<!ELEMENT turbulence (layerBase, (layerThickness | layerTop), turbulenceDescr)>
<!ATTLIST turbulence s CDATA #REQUIRED>
<!ELEMENT layerBase EMPTY>
<!ATTLIST layerBase v CDATA #REQUIRED>
<!ELEMENT layerThickness EMPTY>
<!ATTLIST layerThickness v (%digit;) #REQUIRED>
<!ELEMENT layerTop EMPTY>
<!ATTLIST layerTop v CDATA #REQUIRED>
<!ELEMENT turbulenceDescr EMPTY>
<!ATTLIST turbulenceDescr v (%digit;) #REQUIRED>

<!ELEMENT icing (icingDescr, layerBase, (layerThickness | layerTop))>
<!ATTLIST icing s CDATA #REQUIRED>
<!ELEMENT icingDescr EMPTY>
<!ATTLIST icingDescr v (%digit;) #REQUIRED>

<!ELEMENT windShearLvl (level, wind)>
<!ATTLIST windShearLvl s CDATA #REQUIRED>
<!ELEMENT level EMPTY>
<!ATTLIST level v CDATA #REQUIRED>

<!ELEMENT limMetwatch (timeFrom, timeTill)>
<!ATTLIST limMetwatch s CDATA #REQUIRED>

<!ELEMENT timeFrom (day, hour)>
<!ELEMENT timeTill (day, hour)>

<!ELEMENT autoMetwatch ((timeFrom, timeTill)?)>
<!ATTLIST autoMetwatch s CDATA #REQUIRED>

<!ELEMENT amendedAt (hour, minute)>
<!ATTLIST amendedAt s CDATA #REQUIRED>

<!ELEMENT amendment (isNotScheduled | (hourFrom?, hourTill?,isLtdToCldVisWind))>
<!ATTLIST amendment s CDATA #REQUIRED>
<!ELEMENT isNotScheduled    EMPTY>
<!ELEMENT isLtdToCldVisWind EMPTY>

<!ELEMENT temperature (air?,
                       dewpoint?,
                       (relHumid1, (relHumid2, relHumid3, relHumid4)?)?)>
<!ATTLIST temperature s CDATA #REQUIRED>
<!ELEMENT air         (notAvailable | temp)>
<!ELEMENT temp        EMPTY>
<!ATTLIST temp        v CDATA #REQUIRED
                      u (C|F) #REQUIRED>
<!ELEMENT dewpoint    (notAvailable | temp)>
<!ELEMENT relHumid1   EMPTY>
<!ATTLIST relHumid1   v CDATA #REQUIRED>
<!ELEMENT relHumid2   EMPTY>
<!ATTLIST relHumid2   v CDATA #REQUIRED>
<!ELEMENT relHumid3   EMPTY>
<!ATTLIST relHumid3   v CDATA #REQUIRED>
<!ELEMENT relHumid4   EMPTY>
<!ATTLIST relHumid4   v CDATA #REQUIRED>

<!ELEMENT QNH (notAvailable | invalidFormat | (hPa, inHg?) | inHg)>
<!ATTLIST QNH s CDATA #REQUIRED>
<!ELEMENT inHg EMPTY>
<!ATTLIST inHg v CDATA #REQUIRED>
<!ELEMENT hPa  EMPTY>
<!ATTLIST hPa  v CDATA #REQUIRED>

<!ELEMENT somePressure (inHg | hPa)>
<!ATTLIST somePressure s CDATA #REQUIRED>

<!ELEMENT cloudMaxCover (cloudCover | SKC)>
<!ATTLIST cloudMaxCover s CDATA #REQUIRED>
<!ELEMENT SKC           EMPTY>

<!ELEMENT recentWeatherList (weather+)>

<!ELEMENT windShearList (windShear+)>
<!ELEMENT windShear (rwyDesig | rwyDesigAll)>
<!ATTLIST windShear s CDATA #REQUIRED>

<!ELEMENT rwyStateList (rwyState+)>
<!ELEMENT rwyState (SNOCLO |
                    (((cleared |
                       (depositDepth, depositExtent, depositType)),
                      friction),
                     (rwyDesigAll | rwyDesigRep | rwyDesig)))>
<!ATTLIST rwyState      s CDATA #REQUIRED>
<!ELEMENT SNOCLO        EMPTY>
<!ELEMENT cleared  EMPTY>
<!ELEMENT depositDepth     (notAvailable | invalidFormat | depositDepthVal)>
<!ELEMENT depositDepthVal  EMPTY>
<!ATTLIST depositDepthVal  v CDATA #REQUIRED>
<!ELEMENT depositExtent    (notAvailable | invalidFormat | depositExtentVal)>
<!ELEMENT depositExtentVal EMPTY>
<!ATTLIST depositExtentVal v (0|1|2|5|9) #REQUIRED>
<!ELEMENT depositType      (notAvailable | depositTypeVal)>
<!ELEMENT depositTypeVal   EMPTY>
<!ATTLIST depositTypeVal   v (%digit;) #REQUIRED>
<!ELEMENT friction         (notAvailable | invalidFormat |
                            coefficient | brakingAction | unreliable)>
<!ELEMENT coefficient      EMPTY>
<!ATTLIST coefficient      v CDATA #REQUIRED>
<!ELEMENT brakingAction    EMPTY>
<!ATTLIST brakingAction    v (91|92|93|94|95) #REQUIRED>
<!ELEMENT unreliable       EMPTY>
<!ELEMENT rwyDesigAll   EMPTY>
<!ELEMENT rwyDesigRep   EMPTY>
<!ELEMENT rwyDesig      EMPTY>
<!ATTLIST rwyDesig      v CDATA #REQUIRED>

<!ELEMENT colourCode (BLACK?, (currentColour, predictedColour?)?)>
<!ATTLIST colourCode s CDATA #REQUIRED>
<!ELEMENT BLACK EMPTY>
<!ELEMENT currentColour EMPTY>
<!ATTLIST currentColour v (%colourCodes;) #REQUIRED>
<!ELEMENT predictedColour EMPTY>
<!ATTLIST predictedColour v (%colourCodes;) #REQUIRED>

<!ELEMENT NEFO_PLAYA (SKC | cloudBase)>
<!ATTLIST NEFO_PLAYA s CDATA #REQUIRED>

<!ELEMENT rwyWindList (rwyWind+)>

<!ELEMENT trendList (trend+)>
<!ELEMENT trend (trendType, (trendTime1, trendTime2?)?, probability?,
                 sfcWind?,
                 (CAVOK | (visPrev?, visVert?, weatherList?, cloudList?)),
                 rwyStateList?, colourCode?,
                 (turbulence | icing | windShearLvl | QNH)*)>
<!ATTLIST trend s CDATA #REQUIRED>
<!ATTLIST trendType v (NOSIG|BECMG|TEMPO|INTER|PROB) #REQUIRED>
<!ELEMENT trendType EMPTY>
<!ELEMENT trendTime1 (hour, minute, timeSpec)>
<!ELEMENT timeSpec EMPTY>
<!ATTLIST timeSpec v (FM|TL|AT) #REQUIRED>
<!ELEMENT probability EMPTY>
<!ATTLIST probability v (30|40) #REQUIRED>
<!ELEMENT trendTime2 (hour, minute, timeSpec)>
<!ELEMENT CAVOK EMPTY>

<!ELEMENT tafRemarkList (tafRemark*)>
<!ELEMENT tafRemark (  notRecognised
                     | nextFcstBy | nextFcstAt | amdAt
                     | fcstAutoObs | fcstAutoMETAR)>

<!ELEMENT remarkList (remark*)>
<!ELEMENT remark (    notRecognised
                    | obsStationType | peakWind | thrWind | rwyWind | gridWind
                    | (visVar1, visVar2) | trCloud | visMin
                    | windShift | visibilityAtLoc
                    | cloudMaxCover | visListLoc | rwyStateList | colourCode
                    | cloudOpacityLvl | snowIncr
                    | SLPhPa | SLPinHg | regQNH | QFE | QNH | QFF
                    | rwyState | correctedAt | recentWeatherList
                    | cloudAbove | cloudCoverVar| cloud | reportConcerns
                    | visRwy | tempMaxPeriod | tempMinPeriod
                    | tempHourly | temp24h | precipHourly
                    | AI | RH | SST | OAT
                    | keyword | needMaint
                    | cloudTypes | beginEndPrecip
                    | phenomenonAtLoc | phenomenonOnly
                    | conditionMountainList | conditionValleyList
                    | ceilingAtLoc | phenomOpacityList
                    | cloudTypeLvl | cloudTrace
                    | seaCondition | swellCondition
                    | obscuration | variableCeiling | pressureChange
                    | ceilVisVariable | rwySfcCondition | rainfall
                    | densityAlt | pressureAlt
                    | VISNO | CHINO | obsTimeOffset
                    | waterEquivOfSnow | snowOnGround | snowCover | climate
                    | tornadicActivity | balloon | firstObs | nextObs | lastObs
                    | estimated | RSNK | LAG_PK | RADAT | tempMaxFQ
                    | radiation | hailStones | currentATIS
                    | activeRwy | transitionLvl | obsInitials | QBB | QBJ
                    | windAtLoc)>
<!ELEMENT notRecognised EMPTY>
<!ATTLIST notRecognised s CDATA #REQUIRED>

<!ELEMENT obsStationType (stationType)>
<!ATTLIST obsStationType s CDATA #REQUIRED>
<!ELEMENT stationType EMPTY>
<!ATTLIST stationType v (AO1|AO2|AO2A|AAXX|BBXX|OOXX) #REQUIRED>

<!ELEMENT peakWind ((hour?, minute)?, wind)>
<!ATTLIST peakWind s CDATA #REQUIRED>

<!ELEMENT thrWind (rwyDesig, wind)>
<!ATTLIST thrWind s CDATA #REQUIRED>

<!ELEMENT windAtLoc (wind, windLocation)>
<!ATTLIST windAtLoc s CDATA #REQUIRED>
<!ELEMENT windLocation EMPTY>
<!ATTLIST windLocation v CDATA #REQUIRED>

<!ELEMENT rwyWind (rwyDesig, wind)>
<!ATTLIST rwyWind s CDATA #REQUIRED>

<!ELEMENT visVar1 (distance)>
<!ATTLIST visVar1 s CDATA #REQUIRED>

<!ELEMENT visVar2 (distance)>

<!ELEMENT trCloud EMPTY>
<!ATTLIST trCloud v CDATA #REQUIRED>

<!ELEMENT windShift (FROPA?, hour?, minute)>
<!ATTLIST windShift s CDATA #REQUIRED>
<!ELEMENT FROPA EMPTY>

<!ELEMENT visibilityAtLoc (((rwyDesig, isApproach?) | locationAt), visibility)>
<!ATTLIST visibilityAtLoc s CDATA #REQUIRED>
<!ELEMENT locationAt EMPTY>
<!ATTLIST locationAt v (TWR|SFC|MAR) #REQUIRED>
<!ELEMENT visibility (distance)>

<!ELEMENT correctedAt (hour, minute)>
<!ATTLIST correctedAt s CDATA #REQUIRED>

<!ELEMENT quadrantList (quadrant+)>
<!ELEMENT quadrant EMPTY>
<!ATTLIST quadrant v (1|2|3|4) #REQUIRED>

<!ELEMENT locationAndList (locationThruList*, isStationary?)>
<!ELEMENT locationThruList (location+)>
<!ELEMENT location ((isDistant | inVicinity)?, distance?,
                    isGrid?, isQuadrant?, obscgMtns?,
                    (locationSpec | compassDir | quadrantList))>

<!ELEMENT isStationary EMPTY>

<!ELEMENT isDistant  EMPTY>
<!ELEMENT isGrid     EMPTY>
<!ELEMENT isQuadrant EMPTY>
<!ELEMENT obscgMtns  EMPTY>

<!ELEMENT locationSpec EMPTY>
<!ATTLIST locationSpec v
             (OMTNS|OHD|ALQDS|AT_AP|OVR_AP|NR_AP|IN_VLY|V_D
              |OVR_LK|OVR_RIVER|ALG_MT|ALG_LK|ALG_RIVER|UNKN) #REQUIRED>

<!ELEMENT visListLoc (visLocData+)>
<!ATTLIST visListLoc s CDATA #REQUIRED>
<!ELEMENT visLocData (visibility, locationAndList)>

<!ELEMENT gridWind (wind)>
<!ATTLIST gridWind s CDATA #REQUIRED>

<!ELEMENT cloudOpacityLvl (locationAndList?, eights,
                           (weather | cloudType), cloudBase)>
<!ATTLIST cloudOpacityLvl s CDATA #REQUIRED>
<!ELEMENT eights EMPTY>
<!ATTLIST eights v (0|1|2|3|4|5|6|7|8) #REQUIRED>

<!ELEMENT snowIncr (onGround, pastHour)>
<!ATTLIST snowIncr s CDATA #REQUIRED>
<!ELEMENT pastHour EMPTY>
<!ATTLIST pastHour v CDATA #REQUIRED>
<!ELEMENT onGround EMPTY>
<!ATTLIST onGround v CDATA #REQUIRED>

<!ELEMENT QFF (hPa)>
<!ATTLIST QFF s CDATA #REQUIRED>

<!ELEMENT SLPhPa (notAvailable | invalidFormat | (inHg | hPa))>
<!ATTLIST SLPhPa s CDATA #REQUIRED>

<!ELEMENT SLPinHg (notAvailable | invalidFormat | (inHg | hPa))>
<!ATTLIST SLPinHg s CDATA #REQUIRED>

<!ELEMENT regQNH (hPa)>
<!ATTLIST regQNH s CDATA #REQUIRED>

<!ELEMENT QFE (hPa?, mmHg?)>
<!ATTLIST QFE s CDATA #REQUIRED>

<!ELEMENT mmHg EMPTY>
<!ATTLIST mmHg v CDATA #REQUIRED>

<!ELEMENT cloudAbove (cloudBase, cloudCover, isThin?)>
<!ATTLIST cloudAbove s CDATA #REQUIRED>
<!ELEMENT isThin EMPTY>

<!ELEMENT cloudCoverVar (cloudBase?, cloudCover, cloudCover2)>
<!ATTLIST cloudCoverVar s CDATA #REQUIRED>
<!ELEMENT cloudCover2 EMPTY>
<!ATTLIST cloudCover2 v (%cloudCover;) #REQUIRED>

<!ELEMENT reportConcerns (change, subject)>
<!ATTLIST reportConcerns s CDATA #REQUIRED>
<!ELEMENT change EMPTY>
<!ATTLIST change v (M|B) #REQUIRED>
<!ELEMENT subject EMPTY>
<!ATTLIST subject v (%digit;) #REQUIRED>

<!ELEMENT tempMinPeriod (hours, (notAvailable | temp))>
<!ATTLIST tempMinPeriod s CDATA #REQUIRED>

<!ELEMENT tempMaxPeriod (hours, (notAvailable | temp))>
<!ATTLIST tempMaxPeriod s CDATA #REQUIRED>

<!ELEMENT hours EMPTY>
<!ATTLIST hours v CDATA #REQUIRED>

<!ELEMENT tempHourly (air, dewpoint?)>
<!ATTLIST tempHourly s CDATA #REQUIRED>

<!ELEMENT temp24h (tempMaxPeriod, tempMinPeriod?)>
<!ATTLIST temp24h s CDATA #REQUIRED>

<!ELEMENT precipHourly ((notAvailable |
                        precipAmount | precipAmountTraces),
                        (precipHours | precipHours3o6 | precipHoursNotAvailable))>
<!ATTLIST precipHourly s CDATA #REQUIRED>
<!ELEMENT precipHours EMPTY>
<!ATTLIST precipHours v (1|2|3|6|9|12|15|18|24) #REQUIRED>
<!ELEMENT precipHours3o6 EMPTY>
<!ELEMENT precipHoursNotAvailable EMPTY>
<!ELEMENT precipAmountTraces EMPTY>
<!ELEMENT precipAmount EMPTY>
<!ATTLIST precipAmount v CDATA #REQUIRED
                       u (MM|IN) #REQUIRED>

<!ELEMENT AI (AIVal)>
<!ATTLIST AI s CDATA #REQUIRED>
<!ELEMENT AIVal EMPTY>
<!ATTLIST AIVal v CDATA #REQUIRED>

<!ELEMENT RH (relHumid)>
<!ATTLIST RH s CDATA #REQUIRED>
<!ELEMENT relHumid EMPTY>
<!ATTLIST relHumid v CDATA #REQUIRED>

<!ELEMENT SST (temp)>
<!ATTLIST SST s CDATA #REQUIRED>

<!ELEMENT OAT (temp)>
<!ATTLIST OAT s CDATA #REQUIRED>

<!ELEMENT needMaint EMPTY>
<!ATTLIST needMaint s CDATA #REQUIRED>

<!ELEMENT keyword EMPTY>
<!ATTLIST keyword s CDATA #REQUIRED>
<!ATTLIST keyword v CDATA #REQUIRED>

<!ELEMENT cloudTypes
    ((cloudTypeHigh   | cloudTypeHighAboveOvercast   | cloudTypeHighNA),
     (cloudTypeLow    | cloudTypeLowAboveOvercast    | cloudTypeLowNA),
     (cloudTypeMiddle | cloudTypeMiddleAboveOvercast | cloudTypeMiddleNA),
     (oktasLow | oktasMiddle)?)>
<!ATTLIST cloudTypes s CDATA #REQUIRED>

<!ELEMENT cloudTypeLow              EMPTY>
<!ATTLIST cloudTypeLow              v (%digit;) #REQUIRED>
<!ELEMENT cloudTypeLowAboveOvercast EMPTY>
<!ELEMENT cloudTypeLowNA            EMPTY>

<!ELEMENT cloudTypeMiddle              EMPTY>
<!ATTLIST cloudTypeMiddle              v (%digit;) #REQUIRED>
<!ELEMENT cloudTypeMiddleAboveOvercast EMPTY>
<!ELEMENT cloudTypeMiddleNA            EMPTY>

<!ELEMENT cloudTypeHigh              EMPTY>
<!ATTLIST cloudTypeHigh              v (%digit;) #REQUIRED>
<!ELEMENT cloudTypeHighAboveOvercast EMPTY>
<!ELEMENT cloudTypeHighNA            EMPTY>

<!ELEMENT oktasLow EMPTY>
<!ATTLIST oktasLow v (0|1|2|3|4|5|6|7|8) #REQUIRED>

<!ELEMENT oktasMiddle EMPTY>
<!ATTLIST oktasMiddle v (0|1|2|3|4|5|6|7|8) #REQUIRED>

<!ELEMENT beginEndPrecip (precip+, locationAndList?, (MOV | MOVD)?)>
<!ATTLIST beginEndPrecip s CDATA #REQUIRED>

<!ELEMENT precip (descriptor*, phenomenon+, (startTime | endTime)+)>
<!ELEMENT startTime (hour?, minute)>
<!ELEMENT endTime (hour?, minute)>

<!ELEMENT MOV (locationAndList)>
<!ELEMENT MOVD (locationAndList)>

<!ELEMENT phenomenonAtLoc (phenomDescrPre*, phenomDescrPost*,
                           (   weather
                            | cloudTypeList
                            | cloudCover
                            | lightningTypeList
                            | otherPhenom),
                           locationAndList?, (MOV | MOVD)?,
                           (cloudTypeAsoctd | cloudTypeEmbd)?)>
<!ATTLIST phenomenonAtLoc s CDATA #REQUIRED>

<!ELEMENT phenomenonOnly (phenomDescrPre*, phenomDescrPost*,
                          (   weather
                           | cloudTypeList
                           | cloudCover
                           | lightningTypeList
                           | otherPhenom),
                          (cloudTypeAsoctd | cloudTypeEmbd)?)>
<!ATTLIST phenomenonOnly s CDATA #REQUIRED>

<!ELEMENT lightningTypeList (lightningType+)>

<!ELEMENT lightningType EMPTY>
<!ATTLIST lightningType v (CA|CC|CG|CW|IC) #REQUIRED>

<!ELEMENT otherPhenom EMPTY>
<!ATTLIST otherPhenom v (LTG|VIRGA|AURBO|FG_BNK|PCPN|VLY_FG|HIR_CLDS|FULYR|HZY|BINOVC|ICG|SH|SHS|DEW|VIS_HYR|VIS_LWR|VIS_RDCD|CIG_HYR|CIG_LWR|CLD|CLDS|CLD_EMBD|CLDS_EMBD|TCU_EMBD|PRESFR|PRESRR|FIRE|FIRES|GRASS_FIRE|GRASS_FIRES) #REQUIRED>

<!ELEMENT phenomDescrPre EMPTY>
<!ATTLIST phenomDescrPre v (%phenomDescr;) #REQUIRED>

<!ELEMENT phenomDescrPost EMPTY>
<!ATTLIST phenomDescrPost v (%phenomDescr;) #REQUIRED>

<!ELEMENT cloudTypeList (cloudType+)>

<!ELEMENT conditionMountainList (conditionMountain+)>
<!ATTLIST conditionMountainList s CDATA #REQUIRED>

<!ELEMENT conditionMountain (condMounType, condMounChange?, locationAndList?)>

<!ELEMENT condMounType EMPTY>
<!ATTLIST condMounType v
          (LIB|CLD_SCT|VERS_INC|CNS_POST|CLD_CIME|CIME_INC|GEN_INC|INC|INVIS)
          #REQUIRED>

<!ELEMENT condMounChange EMPTY>
<!ATTLIST condMounChange v
   (NC|CUF|ELEV_SLW|ELEV_RAPID|ELEV_STF|ABB_SLW|ABB_RAPID|STF|STF_ABB|VAR_RAPID)
          #REQUIRED>

<!ELEMENT conditionValleyList (conditionValley+)>
<!ATTLIST conditionValleyList s CDATA #REQUIRED>

<!ELEMENT conditionValley (condVallType, condVallChange?, locationAndList?)>

<!ELEMENT condVallType EMPTY>
<!ATTLIST condVallType v
          (NIL|FOSCHIA|FOSCHIA_SKC_SUP|NEBBIA|NEBBIA_SCT|CLD_SCT|CLD_SCT_NEBBIA_INF|MAR_CLD|INVIS)
          #REQUIRED>

<!ELEMENT condVallChange EMPTY>
<!ATTLIST condVallChange v
          (NC|DIM|DIM_ELEV|DIM_ABB|AUM|AUM_ELEV|AUM_ABB|ELEV|ABB|NEBBIA_INTER)
          #REQUIRED>

<!ELEMENT ceilingAtLoc (cloudBase, isApproach?, locationAndList?, rwyDesig?)>
<!ATTLIST ceilingAtLoc s CDATA #REQUIRED>

<!ELEMENT isApproach EMPTY>

<!ELEMENT phenomOpacityList (phenomOpacity+, (cloudTypeAsoctd|cloudTypeEmbd)?)>
<!ATTLIST phenomOpacityList s CDATA #REQUIRED>

<!ELEMENT cloudTypeAsoctd EMPTY>
<!ATTLIST cloudTypeAsoctd v (%cloudType;) #REQUIRED>

<!ELEMENT cloudTypeEmbd EMPTY>
<!ATTLIST cloudTypeEmbd v (%cloudType;) #REQUIRED>

<!ELEMENT phenomOpacity (eights, (weather | cloudType))>

<!ELEMENT cloudTypeLvl (cloudBase, cloudType)>
<!ATTLIST cloudTypeLvl s CDATA #REQUIRED>

<!ELEMENT cloudTrace ((cloudType+ | cloudTypeNotAvailable), isLower?)>
<!ATTLIST cloudTrace s CDATA #REQUIRED>

<!ELEMENT isLower EMPTY>

<!ELEMENT cloudTypeOnly (cloudType)>
<!ATTLIST cloudTypeOnly s CDATA #REQUIRED>

<!ELEMENT seaCondition (locationAndList?, (seaCondVal | notAvailable))>
<!ATTLIST seaCondition s CDATA #REQUIRED>

<!ELEMENT swellCondition (locationAndList?, (swellCondVal | notAvailable))>
<!ATTLIST swellCondition s CDATA #REQUIRED>

<!ELEMENT seaCondVal EMPTY>
<!ATTLIST seaCondVal v (%digit;) #REQUIRED>

<!ELEMENT swellCondVal EMPTY>
<!ATTLIST swellCondVal v (%digit;) #REQUIRED>

<!ELEMENT obscuration (cloud, (cloudPhenom | weather))>
<!ATTLIST obscuration s CDATA #REQUIRED>

<!ELEMENT cloudPhenom EMPTY>
<!ATTLIST cloudPhenom v (PWR_PLNT | PWR_PLNT_PLUME) #REQUIRED>

<!ELEMENT variableCeiling (cloudBaseFrom, cloudBaseTo)>
<!ATTLIST variableCeiling s CDATA #REQUIRED>

<!ELEMENT cloudBaseFrom EMPTY>
<!ATTLIST cloudBaseFrom v CDATA #REQUIRED
                        u (M|FT) #REQUIRED>
<!ELEMENT cloudBaseTo   EMPTY>
<!ATTLIST cloudBaseTo   v CDATA #REQUIRED
                        u (M|FT) #REQUIRED>

<!ELEMENT pressureChange (hours, (notAvailable | (pressureChangeVal, pressureTendency?)))>
<!ATTLIST pressureChange s CDATA #REQUIRED>

<!ELEMENT pressureChangeVal EMPTY>
<!ATTLIST pressureChangeVal v CDATA #REQUIRED
                            u (hPa) #REQUIRED>
<!ELEMENT pressureTendency EMPTY>
<!ATTLIST pressureTendency v (0|1|2|3|4|5|6|7|8) #REQUIRED>

<!ELEMENT ceilVisVariable (visibilityFrom, visibilityTo)>
<!ATTLIST ceilVisVariable s CDATA #REQUIRED>
<!ELEMENT visibilityFrom (distance)>
<!ELEMENT visibilityTo   (distance)>

<!ELEMENT rwySfcCondition ((notAvailable | decelerometer | rwySfc)+)>
<!ATTLIST rwySfcCondition s CDATA #REQUIRED>

<!ELEMENT decelerometer EMPTY>
<!ATTLIST decelerometer v CDATA #REQUIRED>

<!ELEMENT rwySfc EMPTY>
<!ATTLIST rwySfc v (SLR|LSR|PSR|P|SANDED|WET|DRY|IR|WR) #REQUIRED>

<!ELEMENT rainfall (rainfall0900, rainfall10min)>
<!ATTLIST rainfall s CDATA #REQUIRED>

<!ELEMENT rainfall0900 EMPTY>
<!ATTLIST rainfall0900 v CDATA #REQUIRED>

<!ELEMENT rainfall10min EMPTY>
<!ATTLIST rainfall10min v CDATA #REQUIRED>

<!ELEMENT densityAlt (altitude)>
<!ATTLIST densityAlt s CDATA #REQUIRED>

<!ELEMENT pressureAlt (altitude)>
<!ATTLIST pressureAlt s CDATA #REQUIRED>

<!ELEMENT altitude EMPTY>
<!ATTLIST altitude v CDATA #REQUIRED>
<!ATTLIST altitude u (M|FT) #REQUIRED>

<!ELEMENT VISNO (rwyDesig)>
<!ATTLIST VISNO s CDATA #REQUIRED>

<!ELEMENT CHINO (rwyDesig)>
<!ATTLIST CHINO s CDATA #REQUIRED>

<!ELEMENT obsTimeOffset (minutes)>
<!ATTLIST obsTimeOffset s CDATA #REQUIRED>

<!ELEMENT minutes EMPTY>
<!ATTLIST minutes v CDATA #REQUIRED>

<!ELEMENT waterEquivOfSnow (precipAmount)>
<!ATTLIST waterEquivOfSnow s CDATA #REQUIRED>

<!ELEMENT snowOnGround (precipAmount)>
<!ATTLIST snowOnGround s CDATA #REQUIRED>

<!ELEMENT snowCover (snowCoverType)>
<!ATTLIST snowCover s CDATA #REQUIRED>

<!ELEMENT snowCoverType EMPTY>
<!ATTLIST snowCoverType v
     (ONE_LOOSE|MUCH_LOOSE|TRACE_LOOSE|MEDIUM_PACKED|HARD_PACKED|NIL) #REQUIRED>

<!ELEMENT climate (((precipAmountTraces | precipAmount1Inch | precipAmount1MM),
                    (precipAmount2Inch | precipAmount2MM)?)?,
                   temp1, temp2)>
<!ATTLIST climate s CDATA #REQUIRED>

<!ELEMENT temp1 (temp)>
<!ELEMENT temp2 (temp)>

<!ELEMENT precipAmount1Inch EMPTY>
<!ATTLIST precipAmount1Inch v CDATA #REQUIRED>
<!ELEMENT precipAmount1MM EMPTY>
<!ATTLIST precipAmount1MM v CDATA #REQUIRED>
<!ELEMENT precipAmount2Inch EMPTY>
<!ATTLIST precipAmount2Inch v CDATA #REQUIRED>
<!ELEMENT precipAmount2MM EMPTY>
<!ATTLIST precipAmount2MM v CDATA #REQUIRED>

<!ELEMENT tornadicActivity (tornadicActivityType, (startTime | endTime)+,
                            locationAndList, (MOV | MOVD)?)>
<!ATTLIST tornadicActivity s CDATA #REQUIRED>

<!ELEMENT tornadicActivityType EMPTY>
<!ATTLIST tornadicActivityType v (tornado|funnel_cloud|waterspout) #REQUIRED>

<!ELEMENT balloon ((disappearedAt|visibleTo))>
<!ATTLIST balloon s CDATA #REQUIRED>

<!ELEMENT disappearedAt (distance)>
<!ELEMENT visibleTo (distance)>

<!ELEMENT firstObs ((isStaffed|isManned)?)>
<!ATTLIST firstObs s CDATA #REQUIRED>

<!ELEMENT isStaffed EMPTY>
<!ELEMENT isManned EMPTY>

<!ELEMENT nextObs (obsAt)>
<!ATTLIST nextObs s CDATA #REQUIRED>

<!ELEMENT obsAt (day, hour, minute)>

<!ELEMENT lastObs ((isStaffed|isManned)?, obsAt?)>
<!ATTLIST lastObs s CDATA #REQUIRED>

<!ELEMENT estimated (estimatedItem+)>
<!ATTLIST estimated s CDATA #REQUIRED>

<!ELEMENT estimatedItem EMPTY>
<!ATTLIST estimatedItem v (WND|CIG|CIG_BLN|SLP|ALSTG|CLD_HGTS) #REQUIRED>

<!ELEMENT RSNK (air, wind)>
<!ATTLIST RSNK s CDATA #REQUIRED>

<!ELEMENT LAG_PK (air, dewpoint, wind)>
<!ATTLIST LAG_PK s CDATA #REQUIRED>

<!ELEMENT RADAT (missing | (distance, relHumid))>
<!ATTLIST RADAT s CDATA #REQUIRED>

<!ELEMENT missing EMPTY>

<!ELEMENT tempMaxFQ (temp)>
<!ATTLIST tempMaxFQ s CDATA #REQUIRED>

<!ELEMENT radiation (((  radShortWave | radDirectSolar
                       | ((rad0PosNet           | rad0PosNetNotAvailable)?,
                          (rad1NegNet           | rad1NegNetNotAvailable)?,
                          (rad2GlobalSolar      | rad2GlobalSolarNotAvailable)?,
                          (rad3DiffusedSolar    | rad3DiffusedSolarNotAvailable)?,
                          (rad4DownwardLongWave | rad4DownwardLongWaveNotAvailable)?,
                          (rad5UpwardLongWave   | rad5UpwardLongWaveNotAvailable)?,
                          (rad6ShortWave        | rad6ShortWaveNotAvailable)?)),
                      radiationPeriod)?,
                     ((sunshineNotAvailable | sunshine), sunshinePeriod)?)>
<!ATTLIST radiation s CDATA #REQUIRED>

<!ELEMENT radiationPeriod EMPTY>
<!ATTLIST radiationPeriod v (%period;) #REQUIRED>

<!ELEMENT rad0PosNetNotAvailable           EMPTY>
<!ELEMENT rad1NegNetNotAvailable           EMPTY>
<!ELEMENT rad2GlobalSolarNotAvailable      EMPTY>
<!ELEMENT rad3DiffusedSolarNotAvailable    EMPTY>
<!ELEMENT rad4DownwardLongWaveNotAvailable EMPTY>
<!ELEMENT rad5UpwardLongWaveNotAvailable   EMPTY>
<!ELEMENT rad6ShortWaveNotAvailable        EMPTY>

<!ELEMENT radShortWave EMPTY>
<!ATTLIST radShortWave v CDATA #REQUIRED>

<!ELEMENT radDirectSolar EMPTY>
<!ATTLIST radDirectSolar v CDATA #REQUIRED>

<!ELEMENT rad0PosNet           EMPTY>
<!ATTLIST rad0PosNet           v CDATA #REQUIRED>
<!ATTLIST rad0PosNet           u (%unitRadiation;) #REQUIRED>
<!ELEMENT rad1NegNet           EMPTY>
<!ATTLIST rad1NegNet           v CDATA #REQUIRED>
<!ATTLIST rad1NegNet           u (%unitRadiation;) #REQUIRED>
<!ELEMENT rad2GlobalSolar      EMPTY>
<!ATTLIST rad2GlobalSolar      v CDATA #REQUIRED>
<!ATTLIST rad2GlobalSolar      u (%unitRadiation;) #REQUIRED>
<!ELEMENT rad3DiffusedSolar    EMPTY>
<!ATTLIST rad3DiffusedSolar    v CDATA #REQUIRED>
<!ATTLIST rad3DiffusedSolar    u (%unitRadiation;) #REQUIRED>
<!ELEMENT rad4DownwardLongWave EMPTY>
<!ATTLIST rad4DownwardLongWave v CDATA #REQUIRED>
<!ATTLIST rad4DownwardLongWave u (%unitRadiation;) #REQUIRED>
<!ELEMENT rad5UpwardLongWave   EMPTY>
<!ATTLIST rad5UpwardLongWave   v CDATA #REQUIRED>
<!ATTLIST rad5UpwardLongWave   u (%unitRadiation;) #REQUIRED>
<!ELEMENT rad6ShortWave        EMPTY>
<!ATTLIST rad6ShortWave        v CDATA #REQUIRED>
<!ATTLIST rad6ShortWave        u (%unitRadiation;) #REQUIRED>

<!ELEMENT sunshineNotAvailable EMPTY>
<!ELEMENT sunshine EMPTY>
<!ATTLIST sunshine v CDATA      #REQUIRED
                   u (hour|min) #REQUIRED>
<!ELEMENT sunshinePeriod EMPTY>
<!ATTLIST sunshinePeriod v (%period;) #REQUIRED>

<!ELEMENT hailStones (hailStoneSize)>
<!ATTLIST hailStones s CDATA #REQUIRED>

<!ELEMENT hailStoneSize EMPTY>
<!ATTLIST hailStoneSize v CDATA    #REQUIRED
                        u (IN)     #REQUIRED
                        q (isLess) #IMPLIED>

<!ELEMENT currentATIS (ATIS)>
<!ATTLIST currentATIS s CDATA #REQUIRED>

<!ELEMENT ATIS EMPTY>
<!ATTLIST ATIS v CDATA #REQUIRED>

<!ELEMENT activeRwy (rwyDesig)>
<!ATTLIST activeRwy s CDATA #REQUIRED>

<!ELEMENT transitionLvl (level)>
<!ATTLIST transitionLvl s CDATA #REQUIRED>

<!ELEMENT obsInitials EMPTY>
<!ATTLIST obsInitials s CDATA #REQUIRED>

<!ELEMENT QBB (altitude)>
<!ATTLIST QBB s CDATA #REQUIRED>

<!ELEMENT QBJ (altitude)>
<!ATTLIST QBJ s CDATA #REQUIRED>

<!ELEMENT nextFcstBy (hour, minute)>
<!ATTLIST nextFcstBy s CDATA #REQUIRED>

<!ELEMENT nextFcstAt (day, hour, minute)>
<!ATTLIST nextFcstAt s CDATA #REQUIRED>

<!ELEMENT amdAt (day, hour, minute)>
<!ATTLIST amdAt s CDATA #REQUIRED>

<!ELEMENT fcstAutoObs ((hourFrom, hourTill)?)>
<!ATTLIST fcstAutoObs s CDATA #REQUIRED>

<!ELEMENT fcstAutoMETAR EMPTY>
<!ATTLIST fcstAutoMETAR s CDATA #REQUIRED>

<!ELEMENT windIndicator (notAvailable | (isEstimated?, windUnit))>
<!ATTLIST windIndicator s CDATA #REQUIRED>
<!ELEMENT windUnit      EMPTY>
<!ATTLIST windUnit      v (KT|MPS) #REQUIRED>

<!ELEMENT isEstimated EMPTY>

<!ELEMENT stationId (id, region?)>
<!ATTLIST stationId s CDATA #REQUIRED>

<!ELEMENT region EMPTY>
<!ATTLIST region v (I|II|III|IV|V|VI|Antarctic) #REQUIRED>

<!ELEMENT callSign (id)>
<!ATTLIST callSign s CDATA #REQUIRED>

<!ELEMENT stationPosition (notAvailable |
                           (elevation?, lat, lon, marsdenSquare?))>
<!ATTLIST stationPosition s CDATA #REQUIRED>

<!ELEMENT elevation EMPTY>
<!ATTLIST elevation v CDATA  #REQUIRED
                    u (M|FT) #REQUIRED
                    q (confidenceIsExcellent | confidenceIsGood |
                       confidenceIsFair      | confidenceIsPoor) #REQUIRED>

<!ELEMENT lat EMPTY>
<!ATTLIST lat v CDATA #REQUIRED>

<!ELEMENT lon EMPTY>
<!ATTLIST lon v CDATA #REQUIRED>

<!ELEMENT precipInd (notAvailable | precipIndVal)>
<!ATTLIST precipInd s CDATA #REQUIRED>

<!ELEMENT precipIndVal EMPTY>
<!ATTLIST precipIndVal v (0|1|2|3|4) #REQUIRED>

<!ELEMENT wxInd (notAvailable | wxIndVal)>
<!ATTLIST wxInd s CDATA #REQUIRED>

<!ELEMENT wxIndVal EMPTY>
<!ATTLIST wxIndVal v (0|1|2|3|4|5|6|7) #REQUIRED>

<!ELEMENT baseLowestCloud (notAvailable | (from, to?))>
<!ATTLIST baseLowestCloud s CDATA #REQUIRED>

<!ELEMENT from EMPTY>
<!ATTLIST from v CDATA            #REQUIRED
               u (M)              #REQUIRED
               q (isEqualGreater) #IMPLIED>
<!ELEMENT to EMPTY>
<!ATTLIST to v CDATA #REQUIRED
             u (M)   #REQUIRED>

<!ELEMENT totalCloudCover (notAvailable | skyObscured | oktas)>
<!ATTLIST totalCloudCover s CDATA #REQUIRED>

<!ELEMENT skyObscured EMPTY>
<!ELEMENT oktas EMPTY>
<!ATTLIST oktas v (0|1|2|3|4|5|6|7|8) #REQUIRED>

<!ELEMENT weatherSynop ((weatherPast1NotAvailable | weatherPast1),
                        (weatherPast2NotAvailable | weatherPast2),
                        weatherPresent)>
<!ATTLIST weatherSynop s CDATA #REQUIRED>

<!ELEMENT weatherPast1NotAvailable EMPTY>
<!ELEMENT weatherPast2NotAvailable EMPTY>
<!ELEMENT weatherPast1 EMPTY>
<!ATTLIST weatherPast1 v (%digit;) #REQUIRED>
<!ELEMENT weatherPast2 EMPTY>
<!ATTLIST weatherPast2 v (%digit;) #REQUIRED>
<!ELEMENT weatherPresent EMPTY>
<!ATTLIST weatherPresent v CDATA #REQUIRED>

<!ELEMENT exactObsTime (hour, minute)>
<!ATTLIST exactObsTime s CDATA #REQUIRED>

<!ELEMENT section3 ((  tempMaxPeriod
                     | tempMinPeriod
                     | stateOfGround
                     | tempMinGround
                     | stateOfGroundSnow
                     | snowDepth
                     | evapo
                     | tempChange
                     | radiation
                     | cloudTypesDrift
                     | cloudLocation
                     | pressureChange
                     | precipHourly
                     | cloudInfo
                     | precipCharacter
                     | beginPrecip
                     | endPrecip)*)>

<!ELEMENT stateOfGround (notAvailable | stateOfGroundVal)>
<!ATTLIST stateOfGround s CDATA #REQUIRED>

<!ELEMENT stateOfGroundVal EMPTY>
<!ATTLIST stateOfGroundVal v CDATA #REQUIRED>

<!ELEMENT tempMinGround (notAvailable | (period, temp))>
<!ATTLIST tempMinGround s CDATA #REQUIRED>

<!ELEMENT period EMPTY>
<!ATTLIST period v (%period;) #REQUIRED>

<!ELEMENT stateOfGroundSnow (notAvailable | stateOfGroundSnowVal)>
<!ATTLIST stateOfGroundSnow s CDATA #REQUIRED>

<!ELEMENT stateOfGroundSnowVal EMPTY>
<!ATTLIST stateOfGroundSnowVal v CDATA #REQUIRED>

<!ELEMENT snowDepth (  notAvailable           | invalidFormat
                     | snowDepthLess5mm       | snowDepthCoverNotCont
                     | snowDepthNoMeasurement | snowDepthVal)>
<!ATTLIST snowDepth s CDATA #REQUIRED>

<!ELEMENT evapo (notAvailable | (evapoAmount, evapoIndicator))>
<!ATTLIST evapo s CDATA #REQUIRED>

<!ELEMENT evapoAmount EMPTY>
<!ATTLIST evapoAmount v CDATA #REQUIRED>

<!ELEMENT evapoIndicator EMPTY>
<!ATTLIST evapoIndicator v (%digit;) #REQUIRED>

<!ELEMENT snowDepthLess5mm EMPTY>
<!ELEMENT snowDepthCoverNotCont EMPTY>
<!ELEMENT snowDepthNoMeasurement EMPTY>
<!ELEMENT snowDepthVal EMPTY>
<!ATTLIST snowDepthVal v CDATA #REQUIRED>

<!ELEMENT tempChange (hours, temp)>
<!ATTLIST tempChange s CDATA #REQUIRED>

<!ELEMENT cloudTypesDrift (
   (cloudTypeHighDir   | cloudTypeHighNone   | cloudTypeHighInvisible),
   (cloudTypeLowDir    | cloudTypeLowNone    | cloudTypeLowInvisible),
   (cloudTypeMiddleDir | cloudTypeMiddleNone | cloudTypeMiddleInvisible))>
<!ATTLIST cloudTypesDrift s CDATA #REQUIRED>

<!ELEMENT cloudTypeHighDir EMPTY>
<!ATTLIST cloudTypeHighDir v (%compassDir;) #REQUIRED>
<!ELEMENT cloudTypeHighNone EMPTY>
<!ELEMENT cloudTypeHighInvisible EMPTY>

<!ELEMENT cloudTypeLowDir EMPTY>
<!ATTLIST cloudTypeLowDir v (%compassDir;) #REQUIRED>
<!ELEMENT cloudTypeLowNone EMPTY>
<!ELEMENT cloudTypeLowInvisible EMPTY>

<!ELEMENT cloudTypeMiddleDir EMPTY>
<!ATTLIST cloudTypeMiddleDir v (%compassDir;) #REQUIRED>
<!ELEMENT cloudTypeMiddleNone EMPTY>
<!ELEMENT cloudTypeMiddleInvisible EMPTY>

<!ELEMENT cloudLocation ((cloudTypeNotAvailable | cloudType),
                         (cloudNone | cloudInvisible | cloudDir),
                         (topsInvisible | elevationAngle))>
<!ATTLIST cloudLocation s CDATA #REQUIRED>

<!ELEMENT cloudInvisible EMPTY>
<!ELEMENT cloudNone      EMPTY>
<!ELEMENT cloudDir       EMPTY>
<!ATTLIST cloudDir       v (%compassDir;) #REQUIRED>

<!ELEMENT topsInvisible EMPTY>

<!ELEMENT elevationAngle EMPTY>
<!ATTLIST elevationAngle v CDATA                   #REQUIRED
                         q (isLess|isEqualGreater) #IMPLIED>

<!ELEMENT cloudInfo ((  cloudBase | (cloudBaseFrom, cloudBaseTo)
                      | visVert   | (visVertFrom,   visVertTo)),
                     (cloudTypeNotAvailable | cloudType),
                     totalCloudCover)>
<!ATTLIST cloudInfo s CDATA #REQUIRED>

<!ELEMENT visVertFrom (distance)>
<!ELEMENT visVertTo   (distance)>

<!ELEMENT precipCharacter (noPrecip | (phenomDescr, phenomDescr2?))>
<!ATTLIST precipCharacter s CDATA #REQUIRED>

<!ELEMENT noPrecip EMPTY>

<!ELEMENT phenomDescr EMPTY>
<!ATTLIST phenomDescr v (%phenomDescr;) #REQUIRED>

<!ELEMENT phenomDescr2 EMPTY>
<!ATTLIST phenomDescr2 v (%phenomDescr;) #REQUIRED>

<!ELEMENT beginPrecip (noPrecip | hoursTill | (hoursFrom, hoursTill?))>
<!ATTLIST beginPrecip s CDATA #REQUIRED>

<!ELEMENT endPrecip (noPrecip | hoursTill | (hoursFrom, hoursTill?))>
<!ATTLIST endPrecip s CDATA #REQUIRED>

<!ELEMENT hoursFrom EMPTY>
<!ATTLIST hoursFrom v CDATA       #REQUIRED
                    q (isGreater) #IMPLIED>
<!ELEMENT hoursTill EMPTY>
<!ATTLIST hoursTill v CDATA    #REQUIRED
                    q (isLess) #IMPLIED>
