Modularity in iXML

Hello,

At the 14 October 2025 CG meeting, I reported that NineML version 3.3.2 contains an experimental implementation of Modular iXML (inspired by the work that Steven reported at MarkupUK).

I also said that I made some slightly different design choices and agreed to report them here to encourage discussion. Here’s the sample
from Steven’s paper:

   module: s, (uses; shares)*, ixml.
     uses: -"+uses", RS, from++(-";", s).
   shares: -"+shares", RS, entries.
     from: entries, RS, -"from", rs, location, s.
 -entries: share++(-",", s).
    share: @name, s.
  @source: iri.

There are some obvious typos: “rs” where “RS” was intended and (I think) “location” where “source” was intended. 

Steven uses iri from iri.ixml in the paper. That’s a nice example, but I think we should keep the iXML grammar for iXML simple. I changed iri to string: quoting URIs (often filenames, sometimes with spaces) is just easier for users, I think. And I don’t really want to embed a whole grammar for IRIs here.

That fragment also uses “from” which we already use in the iXML grammar, but that’s easy to fix with a renaming.

Finally, Steven has failed to address the prolog.

With those fixes, we get:

   module: s, (prolog, RS)?, (uses; shares)*, ixml.
     uses: -"+uses", RS, mfrom++(-";", s).
   shares: -"+shares", RS, entries.
    mfrom>from: entries, RS, -"from", RS, source, s.
 -entries: share++(-",", s).
    share: @name, s.
  @source: string .

     ixml: rule++RS, s.

Next, looking at an example:

  +uses decimal from "numbers.ixml" 
  +shares partnumber

  partnumber = -decimal .

I felt like the uses and shares declarations would be more consistent if they ended with a full stop. The full stops are not required to parse, obviously, but I think it’s better for usability. (Don’t make me remember which iXML constructs end with a “.” and which don’t, please.)

Finally, I wanted to avoid having a different grammar for inputs that use modules and inputs that don’t. Creating a new top-level “module” nonterminal is fine, but for non-modular grammars, it changes the XML serialization unnecessarily. (Behind the scenes this is how 3.2.2 works, but I’m planning to reimplement it with a single iXML grammar that includes modules.) I think this works:

         ixml: s, (prolog, RS)?, ((uses; shares), RS)*, rule++RS, s.
         uses: -"+uses", RS, mfrom++(-";", s), s, -'.' .
       shares: -"+shares", RS, entries, s, -'.' .
   mfrom>from: entries, RS, -"from", RS, source .
     -entries: share++(-",", s).
        share: @name.
      @source: string .

This loses the “ixml” wrapper in the module, but it preserves the serialization of existing iXML grammars that don’t use any modularity features.

                                        Be seeing you,
                                          norm

--
Norm Tovey-Walsh
Saxonica

Received on Wednesday, 15 October 2025 10:41:01 UTC