XSugar stylesheet for CF-metadata "standard names"

This page contains the XSugar stylesheet for inter-converting between CF-metadata's plain-text format for standard names and a corresponding XML format.   This stylesheet may be used for parsing standard names (i.e. check that they conform to rules specifying how such names may be constructed), as well as for conversion in either direction.

Note that everything below the horizontal line is that actual XSugar stylesheet - this is the master copy.  So only edit it if you know what you are doing!


/* Robert Muetzelfeldt
   16 Oct 2008
   This is a direct re-casting of the rules given in http://cf-pcmdi.llnl.gov/documents/cf-standard-names/guidelines for
   CF-metadata Standard Names in XSugar.  */



/* Notes:
'Substance' needs to be further analysed in terms of its constituent parts 
*/


BaseName           = amount|area|area_fraction|density|energy|energy_content|energy_density|frequency|frequency_of_occurence|heat_flux|heat_transport|horizontal_streamfunction|horizontal_velocity_potential|mass|mass_flux|mass_fraction|mass_mixing_ratio|mass_transport|mole_fraction|mole_flux|momentum_flux|partial_pressure|period|power|pressure|probability|radiative_flux|specific_eddy_kinetic_energy|speed|stress|temperature|thickness|velocity|volume|volume_flux|volume_fraction|volume_transport|vorticity
Condition          = clear_sky|deep_snow|no_snow
Direction          = upward|downward|northward|southward|eastward|westward|x|y
Medium             = air|atmosphere_boundary_layer|mesosphere|sea_ice|sea_water|soil|soil_water|stratosphere|thermosphere|troposphere
Substance          = condensed_water|oxygen|sulfate_aerosol|ammonium_dry_aerosol|black_carbon_dry_aerosol|cloud_condensed_water|cloud_ice|cloud_liquid_water|convective_cloud_condensed_water|convective_cloud_ice|convective_cloud_liquid_water|dimethyl_sulfide|dust_dry_aerosol|frozen_water|graupel|mercury_dry_aerosol|nitrate_dry_aerosol|ozone|particulate_organic_matter_dry_aerosol|pm1_aerosol|pm10_aerosol|pm2p5_aerosol|precipitation|primary_particulate_organic_matter_dry_aerosol|rain|seasalt_dry_aerosol|secondary_particulate_organic_matter_dry_aerosol|snow|stratiform_cloud_ice|stratiform_cloud_liquid_water|sulfate_dry_aerosol|sulfur_dioxide|unfrozen_water|water
Surface            = toa|tropopause|surface|adiabatic_condensation_level|cloud_top|convective_cloud_top|cloud_base|convective_cloud_base|freezing_level|ground_level|maximum_wind_speed_level|sea_floor|sea_ice_base|sea_level|top_of_atmosphere_boundary_layer|top_of_atmosphere_model|top_of_dry_convection
Process            = advection|convection|deep_convection|diabatic_processes|diffusion|dry_convection|gravity_wave_drag|gyre|isostatic_adjustment|large_scale_precipitation|longwave_heating|moist_convection|overturning|shallow_convection|shortwave_heating|thermodynamics
WhereType          = cloud|land|open_sea|sea|sea_ice|vegetation
NL                 = \r\n|\r|\n
Text               = [a-z]+(_[a-z0-9]+)*





file               : [standard_names Ss]
                   =  [standard_names Ss] >


standard_names     : [standard_name1 S] [NL] [standard_names Ss]
                   =  [standard_name1 S] > [standard_names Ss]


standard_names     >: [Text T] [NL] [standard_names Ss]
                   =  [Text T] > [standard_names Ss]


standard_names     : =



/* The following is actually the "direction of the spatial component", so "component" is a bad name (but kept
   here for consistency with the original terminology).
   Note that the rules allow for two direction terms to be used for a tensor quantity.   Clearly, only
   certain pairings are possible, but I have not built this restriction in as yet. */





standard_name1      : [surface S] [component C] [standard_name N] [at_surface AS] [in_medium M]
                     [due_to_process P] [where_type T] [assuming_condition AC]
                   = [surface S] [component C] [standard_name N] [at_surface AS] [in_medium M]
                     [due_to_process P] [where_type T] [assuming_condition AC]


surface            : [Surface S] "_"
                   =  [Surface S] >

surface            : =





component          : [Direction D1] "_" [Direction D2] "_"
                   =  [Direction D1] >  [Direction D2] >

component          : [Direction D] "_"
                   =  [Direction D] >

component          : =



at_surface         : "_at_" [Surface S]
                   =  [Surface S] >

at_surface         : =





in_medium          : "_in_" [Medium M]
                   =  [Medium M] >

in_medium          : =




due_to_process     : "_due_to_" [Process P]
                   =  [Process P] >

due_to_process     : =




where_type         : "_where_" [WhereType W]
                   =  [WhereType W] >

where_type         : =



assuming_condition : "_assuming_" [Condition C]
                   =  [Condition C] >

                   : =



substance          : [Substance S]
                   =  [Substance S] >




standard_name      : "change_over_time_in_" [standard_name X]
                   =  [standard_name X] >



standard_name      : "convergence_of_" [standard_name X]
                   =  [standard_name X] >

standard_name      : "horizontal_convergence_of_" [standard_name X]
                   =  [standard_name X] >

standard_name      : "correlation_of_" [standard_name X] "_and_" [standard_name Y]
                   =  [standard_name X] [standard_name Y] >

standard_name      : "correlation_of_" [standard_name X] "_and_" [standard_name Y] "_over_" [standard_name Z]
                   =  [standard_name X] [standard_name Y] [standard_name Z] >

standard_name      : "covariance_of_" [standard_name X] "_and_" [standard_name Y]
                   =  [standard_name X] [standard_name Y] >

standard_name      : "covariance_of_" [standard_name X] "_and_" [standard_name Y] "_over_" [standard_name Z]
                   =  [standard_name X] [standard_name Y] [standard_name Z] >

standard_name      : [Direction D] "_derivative_of_" [standard_name X]
                   =  [Direction D] [standard_name X] >

standard_name      : "derivative_of_" [standard_name X] "_wrt_" [standard_name Y]
                   =  [standard_name X] [standard_name Y] >

standard_name      : "direction_of_" [standard_name X]
                   =  [standard_name X] >

standard_name      : "divergence_of_" [standard_name X]
                   =  [standard_name X] >

standard_name      : "horizontal_divergence_of_" [standard_name X]
                   =  [standard_name X] >

standard_name      : "histogram_of_" [standard_name X]
                   =  [standard_name X] >

standard_name      : "histogram_of_" [standard_name X] "_over_" [standard_name Y]
                   =  [standard_name X] [standard_name Y]>

standard_name      : "integral_of_" [standard_name X] "_wrt_" [standard_name Y]
                   =  [standard_name X] [standard_name Y]>


/* I'm really uncomfortable handling standard functions (integral, ln, log10) like this.
   Given that we are now moving into MathML territory,  why not just include MathML?
*/


standard_name      : "ln_" [standard_name X]
                   =  [standard_name X] >

standard_name      : "log10_" [standard_name X]
                   =  [standard_name X] >

standard_name      : "magnitude_of_" [standard_name X]
                   =  [standard_name X] >

standard_name      : "probability_distribution_of_" [standard_name X]
                   =  [standard_name X] >

standard_name      : "probability_distribution_of_" [standard_name X] "_over_" [standard_name Z]
                   =  [standard_name X] [standard_name Z] >

standard_name      : "probability_distribution_function_of_" [standard_name X]
                   =  [standard_name X] >

standard_name      : "probability_distribution_function_of_" [standard_name X] "_over_" [standard_name Z]
                   =  [standard_name X] [standard_name Z] >

standard_name      : "product_of_" [standard_name X] "_and_" [standard_name Y]
                   =  [standard_name X] [standard_name Y] >

standard_name      : "ratio_of_" [standard_name X] "_to_" [standard_name Y]
                   =  [standard_name X] [standard_name Y] >

standard_name      : "square_of_" [standard_name X]
                   =  [standard_name X] >

standard_name      : "tendency_of_" [standard_name X]
                   =  [standard_name X] >

/* Hand-crafted rules */
standard_name      : "mass_concentration_of_" [substance S] [in_medium M]
                   =  [substance S] [in_medium M] >

standard_name      : "mass_fraction_of_" [substance S] [in_medium M]
                   =  [substance S] [in_medium M] >


/* This is a quick fix to get things up and running! */

standard_name      : [BaseName BN]
                   =  [BaseName BN] >