#! /usr/bin/env python

import sys
try:
    import xml.etree.cElementTree as etree
except:
    import xml.etree.ElementTree as etree

def child (elem, name):
    for e in elem.getchildren():
        if e.tag == name:
            return e
    return None

def children (elem, name=None):
    l = elem.getchildren()
    if name:
        l = [e for e in l if e.tag == name]
    return l

xml = etree.parse(sys.argv[1])

for schema in child(xml.getroot(), "schemalist").getchildren():
    e = child(schema, "short")
    if e is not None:
        schema.remove(e)

    e = child(schema, "long")
    if e is not None:
        schema.remove(e)

    for locale in children(schema, "locale"):
        # One locale must exist so leave C locale...
        a = locale.attrib.get("name")
        if a == 'C':
            continue
        e = child(locale, "default")
        if e is None:
            schema.remove(locale)
        else:
            e = child(locale, "short")
            if e is not None:
                locale.remove(e)
            e = child(locale, "long")
            if e is not None:
                locale.remove(e)

xml.write(sys.stdout, "UTF-8")

