Hello. My name is Norm Tovey-Walsh.

I’ve been doing the web thing for a while and I have stuff all over the place, so of course I decided to make a another place. This is my (new) homepage, or pointers to all of my other homepages, if you prefer to look at it that way.

Professionally, I work for Saxonica, Ltd in the UK where I’m norm@saxonica.com. You can find my previous employers and the rest of my CV over on LinkedIn, if you’re so inclined. I occasionally write blog posts about work stuff.

In addition to working on the Saxonica suite of products, I maintain the XML Resolver in Java and C# The XML Resolver provides XML Catalog-based resource resolution starting in SaxonJ 11 and SaxonCS. It’ll also be used in SaxonC and the PHP and Python plugins starting in version 12.

To help get started with SaxonJS, I pulled together a couple of example projects, one for SaxonJS in the browser and one for SaxonJS on Node.js. I wrote SlidesJS to present slides on the web. This was inspired by a SaxonJS tutorial that Debbie Lockett and I presented at Declarative Amsterdam 2021.

I’m a co-chair of the W3C’s XSLT Extensions Community Group (known informally as QT4CG) and serve as its unofficial production manager.

I live in Swansea, Wales 🏴󠁧󠁢󠁷󠁬󠁳󠁿 with my wife Bethan who does languages and linguistics and lexicography and programming and most everything else. At the time of this writing she has only one more PhD than I have. (Pedantically, she’ll argue that the first one is a DPhil, not a PhD, but never mind.)

When I’m not working, I’m ndw@nwalsh.com (or you may know me as norm@tovey-walsh.com, that works too). My PGP key is available if you want to verify that an email came from me, or if you want to send me an encrypted message. I scribble periodically on a personal weblog. (I used to write on another one, but it died.) My previous homepage is out there too. You’ll find me here and there on the web. I toot from @ndw@mastodon.social. I hang out on the xml.com Slack and some Discord channels. You can reach me with WhatsApp, Signal, and Keybase. I use GitHub and GitLab.

I dabble a bit on other projects in my *cough* free time. (The list here is alphabetical by the way, there’s no other significance to the order. I work on things when I work on them.)

DocBook

DocBook is a markup vocabulary for technical documentation. I’m a member of the DocBook Technical Committee. Among other things, I work on the DocBook vocabulary, wrote DocBook: The Definitive Guide, and have worked on three generations of XSLT stylesheets for DocBook, most recently DocBook: xslTNG.

Emacs

Emacs is my editor of choice, though I do use IntelliJ for Java and Scala, I confess. When I was dealing with lots of international teleconferences, I wrote wwtime to help answer “what time is the call” unambigously. And I wrote xmlunicode for inserting Unicode characters by Unicode name or ISO entity name. Recent versions of Emacs have added similar features, but without the support for entity names.

I’m also an Org-mode fan, using it and Org-roam on a daily basis. I use org-to-xml to extract XML from Org-mode files when I want to process them further. That’s how most of my blog posts are created.

I wrote some code to generate random quotations at the bottom of email messages.

Gradle

Gradle is my current build tool of choice; it’s better than the alternatives I’ve tried and I’ve become used to its idiosyncrasies (mostly). I run Saxon with a plugin. My version is a fairly substantial fork, and I want to rework it for Saxon 11 and later, but I haven’t yet. I have plugins for XML Calabash version 1.x and version 3.0 too. I use relaxng-gradle for RELAX NG validation from Gradle.

I use Docker containers for lots of things these days and I wrote gradle-docker-container-plugin to help manage Docker instances from Gradle scripts.

Invisible XML

Invisible XML is a language for describing the implicit structure of data. I’m a member of the Invisible Markup Community Group and the author of a suite of iXML products on the JVM hosted at nineml.org: CoffeeGrinder, an API for Earley and GLL parsing; CoffeeFilter, an API for Invisible XML parsing; CoffeePot, a command-line Invisible XML processor; CoffeeSacks, an Invisible XML extension functions for Saxon; and CoffeePress, an Invisible XML extension step for XML Calabash, my XProc 3.0 processor.

Those of us interested in iXML pragmas are coordinating at gyfre.org.

MarkLogic

In a previous life, I worked on a lot of MarkLogic tools. I expect bit rot is setting in on some of them, but they’re still out there.

Miscellany

Maybe these could be categorized better, but in the short term:

  • I never really came to grips with Maven, so I wrote a little Python library, javaconfig, that attempts to manage classpaths with Maven. It seems to mostly work.
  • I use sshtunnel to manage SSH tunnels.
  • I wrote webserver to manage web servers in Docker containers. This is really useful.
  • I maintain a small collection of Dash docsets

For something completely different: a bit of eye candy. My wordclock displays the time of day in words. It was inspired by qlocktwo.

Photography

I have an account on Flickr, but mostly these days I post photographs on photos.nwalsh.com. I’m interested in seeing if I can use something like Pixelfed to make my photo site a little more social. (My first attempts at running it in Docker were…not successful.)

RELAX NG

Sometimes I work on RELAX NG things. I’ve done a small amount of tinkering with Jing and Trang and relaxng.org, but to be honest it’s been mostly aspirational rather than practical.

TeX

There aren’t many vestiges left of my early days in the TeX world. I wrote Making TeX Work for O’Reilly back in the previous millenium. Much to my surprise, some ancient online help pages I built appear to still be useful. I’m hoping to get back to TeX some day. I publish Org-mode pages with it occasionally.

XML

I wrote a SAX filter to provide xml:id support, though I doubt that’s much needed anymore. I also wrote xjparse to test DTD and XML Schema validation. The html5parse project wraps a command-line tool around the Validator.nu HTML5 parser.

XProc

XProc is an XML pipeline language. I was chair of the original XML Processing Model Working Group and an editor on the 1.0 specification. I’m currently a member of the XProc Next Community Group and a member of the editorial team. I implemented XML Calabash (1.x) an XProc 1.0 processor and am currently implementing JAFPL (just another fine pipeline language, a language agnostic pipeline engine) and XML Calabash (3.0). See xmlcalabash.com.

XSLT

The xslt-relax-ng project is a unified RELAX NG grammar for any version of XSLT.

I use xsltexplorer to analyze complicated stylesheets. It provides a detailed breakdown of what templates, functions, modes, etc. are used and where. I wrote it mostly to make the DocBook: xslTNG Reference Guide more useful.

Unsurprisingly, I use Saxon for a lot of my projects and sometimes the simplest thing to do is just wrap a little JVM technology up in an extension. The sinclude project is an XInclude processor. It’s a lot more flexible than what’s provided by the Xerces parser with the -xi flag. I use scommonmark to transform Markdown. It’s just a wrapper around the org.commonmark CommonMark parser. I wrote great-circle-xslt to support a couple mapping-related projects. It computes the great circle distance between two latitude/longitude pairs.

And other stuff too old or too insignificant to bother mentioning.

Share and enjoy.

Project index

An index of all the links and resources described above and a few related resources.

Books

DocBook

Docker

Emacs

  • org-to-xml, converts Org-mode files to XML
  • wwtime, for publishing times in multiple time zones
  • xml-quotes, generates random quotations from an XML file
  • xmlunicode, to insert XML characters by Unicode name or ISO entity name

Email

Saxonica

  • SaxonC, an XSLT 3.0+ processor library in C++
  • SaxonCS, an XSLT 3.0+ processor on .NET
  • Saxonica, projects from Saxonica
  • Saxonica, Ltd, my employer
  • SaxonJ, an XSLT 3.0+ processor on the JVM
  • SaxonJS, an XSLT 3.0 processor for Node and the browser
  • XML Resolver, projects related to resource resolution with catalogs

GitHub organizations

  • DocBook, projects related to DocBook
  • InvisibleXML, projects related to Invisible XML
  • NineML, projects related to the NineML suite of Invisible XML tools
  • QT4CG, projects related to the XSLT 4.0 extensions community group
  • RELAX NG, projects related to XML grammar-based validation
  • Saxonica, projects from Saxonica
  • XML Resolver, projects related to resource resolution with catalogs
  • XMLCalabash, projects related to XML Calabash 3.0
  • XProc, projects related to XProc

Gradle

Invisible XML

Miscellany

NineML

  • CoffeeFilter, an API for Invisible XML parsing
  • CoffeeGrinder, an API for Early and GLL parsing
  • CoffeePot, a command-line Invisible XML processor
  • CoffeePress, an Invisible XML extension step for XML Calabash
  • CoffeeSacks, an Invisible XML extension functions for Saxon
  • NineML, projects related to the NineML suite of Invisible XML tools
  • nineml.org, the NineML family of Invisible XML tools

Photography

RELAX NG

SaxonJ

SaxonJS

Social media (and related)

TeX

Weblogs

Web sites

Working groups

XML

  • html5parse, an HTML to XML converter
  • sinclude, an XInclude processor
  • xmlidfilter, a SAX filter to support xml:id
  • (And most of the rest of the things on this page, TBH.)

XML Catalogs

XProc

XSLT

Colophon

These pages are mostly authored in XHTML. A bit of transformation is done with XSLT (both server-side and client-side) to simplify authoring and provide a responsive design. The tile motif is decorative.