Until the appearance of XSLT, Omnimark was a frequent choice for SGML conversions. It contained a pattern-matching language which enabled transformation between SGML and non-SGML formats (down-translation), between non-SGML and SGML formats (up-translation), and between arbitrary text formats (cross-translation).
Figure 13. Fragment of Omnimark code showing transformation to LaTeX
down-translate
global stream temp
element ABSTRACT 
        output "%n\begin{abstract}%n%c%n\end{abstract}"
element ACRONYM
        set buffer temp to "%c"
        output "%g(temp)\index{M}{%g(temp)}"
            when attribute remap isnt specified
        output "\acro{%g(temp)}{%v(remap)}"
            when attribute remap is specified
	  In the example in Figure 13, “Fragment of Omnimark code
	    showing transformation to LaTeX”, the
	  %c emits the element content (equivalent to
	  XSLT’s apply-templates);
	  %n is a newline; %g dereferences a
	  buffer; %v dereferences an attribute.
	  A streaming feature meant the document did not have to be
	  read into memory in its entirety; a value not yet encountered
	  in document order (but known to occur) could be referenced, but
	  not dereferenced until the end of processing, by which time
	  the desired value would have been encountered and set as a
	  referent).[6]
For a brief period in the late 1990s the product was made available without charge, but this was later abandoned. The software is still available in a much more advanced version for XML and is widely used in publishing workflows.
[6] Very large documents with very high numbers of such referents typically caused a brief but audible rattling at the end of processing as the disk drive actuator arm repeatedly sought and wrote the data from whatever temporary location had been created during processing.