Skip to content
Node.js module to transform XForms to a format that enketo-core can consume
JavaScript Shell
Branch: master
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Type Name Latest commit message Commit time
Failed to load latest commit information.
setup fixed: node 4.x and 5.x incompatibility, Nov 25, 2015
src changed: further improve docs (#61) Aug 27, 2019
test added: support for range picker (#60) Aug 27, 2019
.editorconfig added: documentation (#56) Aug 16, 2019
.gitignore Added: test coverage (#58) Aug 19, 2019
.travis.yml changed: XML dateTime is now converted to HTML input type="datetime-l… Oct 16, 2019
LICENSE Added: test coverage (#58) Aug 19, 2019
Vagrantfile fixed: node 0.12 compatibility - Whoohoooo!, closes #4 Sep 8, 2015
nyc.config.js Added: test coverage (#58) Aug 19, 2019

coverage-shield-badge-1 npm version Build Status Dependency Status

Enketo Transformer

NodeJS library that transforms OpenRosa/ODK XForms into a format the Enketo understands. It works both as a library module, as well as a standalone app.

Technical Documentation


  1. nodeJS 8 and npm

Install as module

npm install enketo-transformer --save

Use as module

const transformer = require('enketo-transformer');
const xform = fs.readFileSync( 'path/to/xform.xml' );

transformer.transform( {
    // required string of XForm
    xform: xform,
    // optional string, to add theme if no theme is defined in the XForm
    theme: 'sometheme',
    // optional map, to replace jr://..../myfile.png URLs
    media: {
        'myfile.png' : '/path/to/somefile.png',
        'myfile.mp3' : '/another/path/to/2.mp3'
    // optional ability to disable markdown rendering (default is true)
    markdown: false,
    // optional preprocess function that transforms the XForm (as libXMLJs object) to
    // e.g. correct incompatible XForm syntax before Enketo's transformation takes place
    preprocess: doc => doc,
} ).then(function( result ){
    // do something with result

Install as app (web API)

  1. clone repo
  2. install dependencies with npm install

Use as app (web API)

  1. start with npm start
  2. limited use with GET /transform with xform parameter (required, xform URL), or
  3. full-featured use with: POST /transform with URL-encoded body including xform (required, full XForm as a string), theme (optional, string), and media (optional, map) parameters

sample GET request:

curl http://localhost:8085/transform?xform=

sample POST request:

curl -d "xform=<xform>x</xform>&theme=plain&media[myfile.png]=/path/to/somefile.png&media[this]=that" http://localhost:8085/transform

Response format

    "form" : "<form>.....</form>",
    "model": "<model>...</model>",
    "transformerVersion": "1.13.0",
    "languageMap": { "Français": "fr", "English": "en" }


  • run tests with npm test


The script npm run develop runs the app on port 8085 and also serves test/forms on port 8081. You could test the transformation output by placing an XForm in test/forms and running http://localhost:8085/transform?xform=http://localhost:8081/autocomplete.xml

A vagrant configuration file and provisioning script is also included. Use DEBUG environment variable to see debug terminal output, e.g.:

DEBUG=api,transformer,markdown,language node app.js


See license document. Also note the additional 'powered by enketo' footer requirement of enketo-xslt which is used in this repository and therefore applicable.

Change Log

See change log

You can’t perform that action at this time.