inxs – A Python framework for XML transformations without boilerplate.

inxs is inexcessive.

inxs is not XSLT.

inxs is ISC-licensed.

inxs is fully documented here:

At a glimpse

Solving the Wikipedia XSLT example #1:

def extract_person(element):
    return element.attrib['username'], element.find('name').text

def append_person(previous_result, result):
    lxml_utils.subelement(result, 'name', {'username': previous_result[0]},

transformation = Transformation(
    Rule('person', (extract_person, append_person)),
    result_object='context.result', context={'result': etree.Element('root')})

# that's five (or not counting line-breaks: nine) lines less sloc
# than the XSLT implementation

Solving the Wikipedia XSLT example #2:

def generate_skeleton(context, e):
    context.persons_list = e.ul()
    context.html = e.html(
        e.head(e.title('Testing XML Example')),
        e.body(e.h1('Persons'), context.persons_list))

def extract_person(element, persons):
    persons.append((element.find('name').text, element.find('family-name').text))

def list_persons(previous_result, persons_list, e):
    persons_list.extend('{x[1]}, {x[0]}') for x in previous_result)

transformation = Transformation(
    Rule('person', extract_person),
    lib.sorter('persons', itemgetter(1)),
    result_object='context.html', context={'persons': []})

# that's eight (or not counting line-breaks: thirteen) lines less sloc
# than the XSLT implementation

Here you can find the source repository and issue tracker of inxs.