<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://pickwiki.org/index.php?action=history&amp;feed=atom&amp;title=MakeXml</id>
	<title>MakeXml - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://pickwiki.org/index.php?action=history&amp;feed=atom&amp;title=MakeXml"/>
	<link rel="alternate" type="text/html" href="https://pickwiki.org/index.php?title=MakeXml&amp;action=history"/>
	<updated>2026-04-28T22:13:22Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.43.0</generator>
	<entry>
		<id>https://pickwiki.org/index.php?title=MakeXml&amp;diff=2027&amp;oldid=prev</id>
		<title>Conversion script: link fix</title>
		<link rel="alternate" type="text/html" href="https://pickwiki.org/index.php?title=MakeXml&amp;diff=2027&amp;oldid=prev"/>
		<updated>2015-02-26T23:48:55Z</updated>

		<summary type="html">&lt;p&gt;link fix&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;Back to [[BasicSource]]&lt;br /&gt;
&lt;br /&gt;
This program generates XML using the standard dictionaries.  One of the nice bits is that it can use phrases to reduce the input line size and to bundle stuff into sub-elements.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
PROGRAM MAKEXML&lt;br /&gt;
* ECL - KRJ - Generates XML using standard dictionaries&lt;br /&gt;
*&lt;br /&gt;
**** NOTE - ECL is what Unidata called TCL - it&amp;#039;s not a company name,&lt;br /&gt;
****        it&amp;#039;s advising that this is a command line utility.&lt;br /&gt;
****        KRJ are my iniials - Keith Robert Johnson. I wrote most of it, you use it at your own risk.&lt;br /&gt;
****        SKR is Shayne Riches - the 10 line GRAPH subroutine is his, I think I asked him if I could&lt;br /&gt;
****        use it, but it was so long ago I can&amp;#039;t remember exactly.  Don&amp;#039;t use it if you don&amp;#039;t want to.&lt;br /&gt;
****        The rest of this program is Public Domain, you can do what you want with it - even change the&lt;br /&gt;
****        source if you find a bug (just not just because you don&amp;#039;t like my style - now please!)&lt;br /&gt;
****&lt;br /&gt;
* You have to make the WRITESEQ lines work for the U2 brand&lt;br /&gt;
* Unidata - WRITESEQ LINE APPEND ON ...&lt;br /&gt;
* Universe &amp;amp; QM - WRITESEQ LINE ON ...&lt;br /&gt;
*&lt;br /&gt;
* Next lines for QM&lt;br /&gt;
$MODE UV.LOCATE&lt;br /&gt;
      EQU ITATT TO 16&lt;br /&gt;
* Next lines for Universe&lt;br /&gt;
* $OPTIONS PICK.FORMAT -STATIC.DIM&lt;br /&gt;
* EQU ITATT TO 20&lt;br /&gt;
* Next lines for Unidata&lt;br /&gt;
* $BASICTYPE &amp;#039;P&amp;#039;&lt;br /&gt;
* EQU ITATT TO 8&lt;br /&gt;
*&lt;br /&gt;
      VERSION = &amp;#039;xml version=&amp;quot;1.0&amp;quot;&amp;#039;&lt;br /&gt;
      COMD = &amp;#039;MAKEXML&amp;#039;&lt;br /&gt;
      SENTENCE = OCONV(@SENTENCE,&amp;#039;MCU&amp;#039;)&lt;br /&gt;
      TEST = INDEX(SENTENCE,COMD,1)&lt;br /&gt;
      IF TEST THEN&lt;br /&gt;
         SENTENCE = TRIM(@SENTENCE[TEST+LEN(COMD),LEN(@SENTENCE)])&lt;br /&gt;
      END ELSE SENTENCE = @SENTENCE&lt;br /&gt;
      OPTIONS = FIELD(SENTENCE,&amp;#039;(&amp;#039;,2)&lt;br /&gt;
      SENTENCE = FIELD(SENTENCE,&amp;#039;(&amp;#039;,1)&lt;br /&gt;
      OPTIONS = OCONV(FIELD(OPTIONS,&amp;#039;)&amp;#039;,1),&amp;#039;MCU&amp;#039;)&lt;br /&gt;
*&lt;br /&gt;
      ESC = CHAR(27)&lt;br /&gt;
      AMPERSAND = CHAR(38)&lt;br /&gt;
      T1 = CHAR(9)&lt;br /&gt;
      T2 = T1:T1&lt;br /&gt;
      T3 = T1:T1:T1&lt;br /&gt;
      BELL = STR(CHAR(7),20)&lt;br /&gt;
      BAD = @TRUE&lt;br /&gt;
      FIRST = @TRUE&lt;br /&gt;
* Get the operating system (text) file we want to create - and where from&lt;br /&gt;
      [[TYPE19FILE]] = FIELD(SENTENCE,&amp;#039; &amp;#039;,1)&lt;br /&gt;
      [[TYPE19ITEM]] = FIELD(SENTENCE,&amp;#039; &amp;#039;,2)&lt;br /&gt;
      FNAME = FIELD(SENTENCE,&amp;#039; &amp;#039;,3)&lt;br /&gt;
      DICTS = TRIM(SENTENCE[COL2(),LEN(SENTENCE)])&lt;br /&gt;
* If we haven&amp;#039;t got the data source, give help&lt;br /&gt;
      IF FNAME EQ &amp;#039;&amp;#039; THEN&lt;br /&gt;
         CRT @(-1):&lt;br /&gt;
         CRT COMD:&amp;#039; - Generates XML&amp;#039;&lt;br /&gt;
         CRT&lt;br /&gt;
         CRT &amp;#039;SYNTAX - &amp;#039;:COMD:&amp;#039; type19file item file [fields] (Options)&amp;#039;&lt;br /&gt;
         CRT&lt;br /&gt;
         CRT &amp;#039;OPTIONS&amp;#039;&lt;br /&gt;
         CRT &amp;#039; G - Generate a schema only (.XSD)&amp;#039;&lt;br /&gt;
         CRT &amp;#039; D - DTD output only (.DTD)&amp;#039;&lt;br /&gt;
         CRT &amp;#039; K - Kill empty attributes (IE ignore them in XML)&amp;#039;&lt;br /&gt;
         CRT &amp;#039; Q - Quiet, do not display progress information&amp;#039;&lt;br /&gt;
         CRT &amp;#039; X - XSL outout required (This creates XML as well)&amp;#039;&lt;br /&gt;
         CRT&lt;br /&gt;
         CRT &amp;#039;NOTES&amp;#039;&lt;br /&gt;
         CRT &amp;#039;If type19file is &amp;quot;CRT&amp;quot; output is to the screen.&amp;#039;&lt;br /&gt;
         CRT &amp;#039;The output file will have extensions added to suit the type&amp;#039;&lt;br /&gt;
         CRT &amp;#039;of output requested. If XSL file output is requested, then&amp;#039;&lt;br /&gt;
         CRT &amp;#039;BOTH the XSL and XML outputs are produced.&amp;#039;&lt;br /&gt;
         STOP&lt;br /&gt;
      END&lt;br /&gt;
*&lt;br /&gt;
* Get the options&lt;br /&gt;
      IF INDEX(OPTIONS,&amp;#039;Q&amp;#039;,1) THEN QUIET = @TRUE ELSE QUIET = @FALSE&lt;br /&gt;
      IF INDEX(OPTIONS,&amp;#039;K&amp;#039;,1) THEN KILL = @TRUE ELSE KILL = @FALSE&lt;br /&gt;
      OUTPUT = &amp;#039;XML&amp;#039;&lt;br /&gt;
      IF INDEX(OPTIONS,&amp;#039;D&amp;#039;,1) THEN OUTPUT = &amp;#039;DTD&amp;#039;&lt;br /&gt;
      IF INDEX(OPTIONS,&amp;#039;G&amp;#039;,1) THEN OUTPUT = &amp;#039;XSD&amp;#039;&lt;br /&gt;
      IF INDEX(OPTIONS,&amp;#039;X&amp;#039;,1) THEN OUTPUT = &amp;#039;XSL&amp;#039;&lt;br /&gt;
      IF OUTPUT NE &amp;#039;XML&amp;#039; THEN QUIET = @TRUE&lt;br /&gt;
      IF @TTY EQ &amp;#039;phantom&amp;#039; THEN QUIET = @TRUE&lt;br /&gt;
* Check if we have got dictionary items&lt;br /&gt;
      IF DICTS EQ &amp;#039;&amp;#039; THEN&lt;br /&gt;
         CRT &amp;#039;Dictionary Items are required for XML&amp;#039;&lt;br /&gt;
         STOP&lt;br /&gt;
      END&lt;br /&gt;
*&lt;br /&gt;
* Display graph if terminal and select list is active&lt;br /&gt;
      TOTCNT = SYSTEM(11)&lt;br /&gt;
* Next line for Universe&lt;br /&gt;
      IF TOTCNT THEN TOTCNT = @SELECTED&lt;br /&gt;
*&lt;br /&gt;
      CNTR = 0&lt;br /&gt;
      OLD.PCT = 0&lt;br /&gt;
      SHOW = @FALSE&lt;br /&gt;
      IF TOTCNT THEN SHOW = @TRUE&lt;br /&gt;
      IF QUIET THEN SHOW = @FALSE&lt;br /&gt;
*&lt;br /&gt;
* Open, check, and initialise the transfer file&lt;br /&gt;
      IF [[TYPE19FILE]] NE &amp;#039;CRT&amp;#039; THEN&lt;br /&gt;
         OPEN [[TYPE19FILE]] TO TRANSFER.FILE ELSE&lt;br /&gt;
            CRT &amp;#039;Cannot open file &amp;#039;:[[TYPE19FILE]]:BELL&lt;br /&gt;
            STOP&lt;br /&gt;
         END&lt;br /&gt;
* I THINK the next line will work in Unidata&lt;br /&gt;
         IF FILEINFO(TRANSFER.FILE,3) NE &amp;#039;4&amp;#039; THEN&lt;br /&gt;
            CRT [[TYPE19FILE]]:&amp;#039; is not type 1 or 19 file (Directory)&amp;#039;:BELL&lt;br /&gt;
            STOP&lt;br /&gt;
         END&lt;br /&gt;
         DELETE TRANSFER.FILE, [[TYPE19ITEM]]:&amp;#039;.&amp;#039;:OUTPUT&lt;br /&gt;
         IF OUTPUT = &amp;#039;XSL&amp;#039; THEN DELETE TRANSFER.FILE, [[TYPE19ITEM]]:&amp;#039;.XML&amp;#039;&lt;br /&gt;
      END ELSE SHOW = @FALSE; QUIET = @TRUE&lt;br /&gt;
*&lt;br /&gt;
* Open the source file and its dictionary&lt;br /&gt;
      OPEN FNAME TO IFILE ELSE&lt;br /&gt;
         CRT &amp;#039;Cannot open file &amp;#039;:FNAME:BELL&lt;br /&gt;
         STOP&lt;br /&gt;
      END&lt;br /&gt;
      OPEN &amp;#039;DICT&amp;#039;,FNAME TO DFILE ELSE&lt;br /&gt;
         CRT &amp;#039;Cannot open the dictionary of file &amp;#039;:FNAME:BELL&lt;br /&gt;
         STOP&lt;br /&gt;
      END&lt;br /&gt;
*&lt;br /&gt;
* Make sure the name of the file is good XML&lt;br /&gt;
      XMLNAME = FNAME&lt;br /&gt;
      CONVERT &amp;#039; &amp;#039;:CHAR(9) TO &amp;#039;&amp;#039; IN XMLNAME&lt;br /&gt;
      FRAG = XMLNAME; GOSUB CHANGE.CHARS; XMLNAME = FRAG&lt;br /&gt;
*&lt;br /&gt;
* Build up the dictionary data&lt;br /&gt;
      FIELD.LIST = CONVERT(&amp;#039; &amp;#039;,@AM,DICTS)&lt;br /&gt;
      XXCNT = DCOUNT(FIELD.LIST,@AM)&lt;br /&gt;
*&lt;br /&gt;
* Pass through the dictionary list, expanding any phrases&lt;br /&gt;
* and setting out XML attributes, multivalues, and associated (or grouped)&lt;br /&gt;
* U2 attributes.&lt;br /&gt;
      PHRASES = &amp;#039;&amp;#039;&lt;br /&gt;
      ATTS = &amp;#039;&amp;#039;&lt;br /&gt;
      TAGS = &amp;#039;&amp;#039;&lt;br /&gt;
      GRPS = &amp;#039;&amp;#039;&lt;br /&gt;
      GGCNT = 0&lt;br /&gt;
      GROUPS = &amp;#039;&amp;#039;&lt;br /&gt;
      GRP.TITLE = &amp;#039;&amp;#039;&lt;br /&gt;
      FOR XX = 1 TO XXCNT&lt;br /&gt;
         ID = FIELD.LIST&amp;lt;XX&amp;gt;&lt;br /&gt;
         READ DREC FROM DFILE,ID THEN&lt;br /&gt;
            IF OCONV(DREC[1,2],&amp;#039;MCU&amp;#039;) EQ &amp;#039;PH&amp;#039; THEN&lt;br /&gt;
               LOCATE ID IN PHRASES SETTING POSN THEN&lt;br /&gt;
                  CRT &amp;#039;Circular reference - &amp;#039;:&lt;br /&gt;
                  CRT ID:&amp;#039; is a phrase that has been used before.&amp;#039;&lt;br /&gt;
                  STOP&lt;br /&gt;
               END&lt;br /&gt;
               PHRASES&amp;lt;-1&amp;gt; = ID&lt;br /&gt;
               NEWBIT = CONVERT(&amp;#039; &amp;#039;,@AM,DREC&amp;lt;2&amp;gt;)&lt;br /&gt;
               YYCNT = DCOUNT(NEWBIT,@AM)&lt;br /&gt;
               FIELD.LIST&amp;lt;XX&amp;gt; = NEWBIT&lt;br /&gt;
               XX = XX - 1&lt;br /&gt;
               XXCNT = XXCNT + YYCNT - 1&lt;br /&gt;
            END ELSE&lt;br /&gt;
               BEGIN CASE&lt;br /&gt;
                  CASE DREC&amp;lt;1&amp;gt;[1,1] = &amp;#039;A&amp;#039; OR DREC&amp;lt;6&amp;gt; = &amp;#039;S&amp;#039;&lt;br /&gt;
                     ATTS&amp;lt;-1&amp;gt; = XX&lt;br /&gt;
* NOTE - I can&amp;#039;t remember how Unidata handles groups&lt;br /&gt;
                  CASE DREC&amp;lt;6&amp;gt; = &amp;#039;M&amp;#039; AND DREC&amp;lt;7&amp;gt; NE &amp;#039;&amp;#039;&lt;br /&gt;
                     GNAME = DREC&amp;lt;7&amp;gt;&lt;br /&gt;
* Only allow two words maximum as a group title&lt;br /&gt;
* The first word will be a sort of wrapper for the second, if there is one&lt;br /&gt;
                     GNAME = TRIM(GNAME)&lt;br /&gt;
                     TEST = INDEX(GNAME,&amp;#039; &amp;#039;,2)&lt;br /&gt;
                     IF TEST THEN GNAME = GNAME[1,TEST-1]&lt;br /&gt;
                     LOCATE GNAME IN GROUPS SETTING POSN THEN&lt;br /&gt;
                        GRPS&amp;lt;POSN,-1&amp;gt; = XX&lt;br /&gt;
                     END ELSE&lt;br /&gt;
                        GGCNT = GGCNT + 1&lt;br /&gt;
                        GROUPS&amp;lt;GGCNT&amp;gt; = GNAME&lt;br /&gt;
                        FRAG = GNAME; GOSUB CHANGE.CHARS&lt;br /&gt;
                        GRP.TITLE&amp;lt;GGCNT&amp;gt; = FRAG&lt;br /&gt;
                        GRPS&amp;lt;GGCNT&amp;gt; = XX&lt;br /&gt;
                     END&lt;br /&gt;
* Multivalues are set out as elements, and require tags&lt;br /&gt;
                  CASE DREC&amp;lt;6&amp;gt; = &amp;#039;M&amp;#039;&lt;br /&gt;
                     TAGS&amp;lt;-1&amp;gt; = XX&lt;br /&gt;
                  CASE 1&lt;br /&gt;
                     CRT ID:&amp;#039; is an invalid dictionary field&amp;#039;&lt;br /&gt;
                     STOP&lt;br /&gt;
               END CASE&lt;br /&gt;
            END&lt;br /&gt;
         END&lt;br /&gt;
      NEXT XX&lt;br /&gt;
*&lt;br /&gt;
* Dimension and initialise the dictionary stuff&lt;br /&gt;
      DIM DICT.RECS(XXCNT); MAT DICT.RECS = &amp;#039;&amp;#039;&lt;br /&gt;
      DIM DICT.CONV(XXCNT); MAT DICT.CONV = &amp;#039;&amp;#039;&lt;br /&gt;
      DIM DICT.TYPE(XXCNT); MAT DICT.TYPE = &amp;#039;&amp;#039;&lt;br /&gt;
      DIM DICT.TITL(XXCNT); MAT DICT.TITL = &amp;#039;&amp;#039;&lt;br /&gt;
*&lt;br /&gt;
* Process the dictionary data&lt;br /&gt;
      FOR XX = 1 TO XXCNT&lt;br /&gt;
         ID = FIELD.LIST&amp;lt;XX&amp;gt;&lt;br /&gt;
         READ DREC FROM DFILE, ID THEN&lt;br /&gt;
            DTYPE = DREC&amp;lt;1&amp;gt;[1,1]&lt;br /&gt;
            IF DTYPE EQ &amp;#039;V&amp;#039; THEN DTYPE = &amp;#039;I&amp;#039;&lt;br /&gt;
* Convert A-type to D-type - our software can have conversion on 8 or 7&lt;br /&gt;
            IF DTYPE = &amp;#039;A&amp;#039; THEN&lt;br /&gt;
               TEMP = &amp;#039;D&amp;#039;:@AM:DREC&amp;lt;2&amp;gt;:@AM:DREC&amp;lt;8&amp;gt;:@AM:DREC&amp;lt;3&amp;gt;&lt;br /&gt;
               TEMP&amp;lt;5&amp;gt; = DREC&amp;lt;10&amp;gt;:DREC&amp;lt;9&amp;gt;&lt;br /&gt;
               TEMP&amp;lt;6&amp;gt; = &amp;#039;S&amp;#039;&lt;br /&gt;
               IF DREC&amp;lt;7&amp;gt; NE &amp;#039;&amp;#039; THEN TEMP&amp;lt;3&amp;gt; = DREC&amp;lt;7&amp;gt;&lt;br /&gt;
               DREC = TEMP&lt;br /&gt;
               DTYPE = &amp;#039;D&amp;#039;&lt;br /&gt;
            END&lt;br /&gt;
* Check the dictionary is compiled&lt;br /&gt;
            IF DTYPE EQ &amp;#039;I&amp;#039; AND DREC&amp;lt;ITATT&amp;gt; = &amp;#039;&amp;#039; THEN&lt;br /&gt;
               EXECUTE &amp;#039;COMPILE.DICT &amp;#039;:FNAME:&amp;#039; &amp;#039;:ID CAPTURING JUNK&lt;br /&gt;
               READ DREC FROM DFILE, ID ELSE DREC = &amp;#039;&amp;#039;&lt;br /&gt;
               IF DREC&amp;lt;ITATT&amp;gt; EQ &amp;#039;&amp;#039; THEN&lt;br /&gt;
                  CRT &amp;#039;Cannot compile dictionary &amp;#039;:ID&lt;br /&gt;
                  STOP&lt;br /&gt;
               END&lt;br /&gt;
            END&lt;br /&gt;
            IF DTYPE EQ &amp;#039;D&amp;#039; OR DTYPE EQ &amp;#039;I&amp;#039; THEN&lt;br /&gt;
               BAD = @FALSE&lt;br /&gt;
               DICT.RECS(XX) = DREC&lt;br /&gt;
               DICT.CONV(XX) = DREC&amp;lt;3&amp;gt;&lt;br /&gt;
               TITL = ID&lt;br /&gt;
               FRAG = TITL; GOSUB CHANGE.CHARS; TITL = FRAG&lt;br /&gt;
               DICT.TITL(XX) = TITL&lt;br /&gt;
               DICT.TYPE(XX) = DTYPE&lt;br /&gt;
            END&lt;br /&gt;
         END&lt;br /&gt;
      NEXT XX&lt;br /&gt;
      IF BAD THEN&lt;br /&gt;
         CRT BELL:&amp;#039;No Dictionary items chosen&amp;#039;:BELL&lt;br /&gt;
         STOP&lt;br /&gt;
      END&lt;br /&gt;
*&lt;br /&gt;
* See what the maximum number in a group is and dimension group workspace&lt;br /&gt;
      GMAX = 1&lt;br /&gt;
      FOR GG = 1 TO GGCNT&lt;br /&gt;
         GNUM = DCOUNT(GRPS&amp;lt;GG&amp;gt;,@VM)&lt;br /&gt;
         IF GNUM GT GMAX THEN GMAX = GNUM&lt;br /&gt;
      NEXT GG&lt;br /&gt;
      DIM GDAT(GMAX)&lt;br /&gt;
*&lt;br /&gt;
* Now generate the output file&lt;br /&gt;
      BEGIN CASE&lt;br /&gt;
         CASE OUTPUT = &amp;#039;DTD&amp;#039;; GOSUB OUTPUT.DTD&lt;br /&gt;
         CASE OUTPUT = &amp;#039;XSD&amp;#039;; GOSUB OUTPUT.SCHEMA&lt;br /&gt;
         CASE OUTPUT = &amp;#039;XSL&amp;#039;&lt;br /&gt;
            GOSUB OUTPUT.XSL&lt;br /&gt;
            IF [[TYPE19FILE]] NE &amp;#039;CRT&amp;#039; THEN&lt;br /&gt;
               CLOSESEQ DEST ON ERROR CRT &amp;#039;CLOSESEQ ERROR&amp;#039;:BELL&lt;br /&gt;
               FIRST = @TRUE&lt;br /&gt;
               GOSUB OUTPUT.XML&lt;br /&gt;
            END&lt;br /&gt;
         CASE 1&lt;br /&gt;
            GOSUB OUTPUT.XML&lt;br /&gt;
      END CASE&lt;br /&gt;
      IF [[TYPE19FILE]] NE &amp;#039;CRT&amp;#039; THEN&lt;br /&gt;
*        CLOSESEQ DEST ON ERROR CRT &amp;#039;CLOSESEQ ERROR&amp;#039;:BELL&lt;br /&gt;
CLOSESEQ DEST&lt;br /&gt;
      END&lt;br /&gt;
      STOP&lt;br /&gt;
*&lt;br /&gt;
*&lt;br /&gt;
*********************************************************************&lt;br /&gt;
* SUBROUTINES&lt;br /&gt;
*********************************************************************&lt;br /&gt;
PACK.ITEM:&lt;br /&gt;
**********&lt;br /&gt;
      REC = @RECORD&lt;br /&gt;
      LINE = &amp;#039;&amp;#039;&lt;br /&gt;
      XMLID = @ID&lt;br /&gt;
      FRAG = XMLID; GOSUB CHANGE.CHARS; XMLID = FRAG&lt;br /&gt;
      LINE = &amp;#039;&amp;lt;item id=&amp;quot;&amp;#039;:XMLID:&amp;#039;&amp;quot;&amp;#039;&lt;br /&gt;
      YYCNT = DCOUNT(ATTS,@AM)&lt;br /&gt;
      FOR YY = 1 TO YYCNT&lt;br /&gt;
         XX = ATTS&amp;lt;YY&amp;gt;&lt;br /&gt;
         IF DICT.TYPE(XX) EQ &amp;#039;D&amp;#039; THEN&lt;br /&gt;
            IF DICT.RECS(XX)&amp;lt;2&amp;gt; EQ &amp;#039;0&amp;#039; THEN&lt;br /&gt;
               BIT = @ID&lt;br /&gt;
* Just hope it is single valued&lt;br /&gt;
            END ELSE BIT = REC&amp;lt;DICT.RECS(XX)&amp;lt;2&amp;gt;&amp;gt;&lt;br /&gt;
         END ELSE&lt;br /&gt;
            BIT = ITYPE(DICT.RECS(XX))&lt;br /&gt;
         END&lt;br /&gt;
         IF DICT.CONV(XX) NE &amp;#039;&amp;#039; THEN BIT = OCONV(BIT,DICT.CONV(XX))&lt;br /&gt;
         IF KILL AND BIT EQ &amp;#039;&amp;#039; ELSE&lt;br /&gt;
            FRAG = BIT; GOSUB CHANGE.CHARS; BIT = FRAG&lt;br /&gt;
            LINE := &amp;#039; &amp;#039;:DICT.TITL(XX):&amp;#039;=&amp;quot;&amp;#039;:BIT:&amp;#039;&amp;quot;&amp;#039;&lt;br /&gt;
         END&lt;br /&gt;
      NEXT YY&lt;br /&gt;
      LINE := &amp;#039;&amp;gt;&amp;#039;&lt;br /&gt;
      GOSUB WRITE.LINE; IF BAD THEN RETURN&lt;br /&gt;
*&lt;br /&gt;
      YYCNT = DCOUNT(TAGS,@AM)&lt;br /&gt;
      FOR YY = 1 TO YYCNT&lt;br /&gt;
         XX = TAGS&amp;lt;YY&amp;gt;&lt;br /&gt;
         IF DICT.TYPE(XX) EQ &amp;#039;D&amp;#039; THEN&lt;br /&gt;
            IF DICT.RECS(XX)&amp;lt;2&amp;gt; EQ &amp;#039;0&amp;#039; THEN&lt;br /&gt;
               BIT = @ID&lt;br /&gt;
            END ELSE BIT = REC&amp;lt;DICT.RECS(XX)&amp;lt;2&amp;gt;&amp;gt;&lt;br /&gt;
         END ELSE&lt;br /&gt;
            BIT = ITYPE(DICT.RECS(XX))&lt;br /&gt;
         END&lt;br /&gt;
         BIT = RAISE(BIT)&lt;br /&gt;
         ZZCNT = DCOUNT(BIT,@AM)&lt;br /&gt;
         FOR ZZ = 1 TO ZZCNT&lt;br /&gt;
* Note how subvalues are ignored - my decision, you may disagree&lt;br /&gt;
            ZIT = BIT&amp;lt;ZZ,1&amp;gt;&lt;br /&gt;
            IF DICT.CONV(XX) NE &amp;#039;&amp;#039; THEN ZIT = OCONV(ZIT,DICT.CONV(XX))&lt;br /&gt;
            FRAG = ZIT; GOSUB CHANGE.CHARS; ZIT = FRAG&lt;br /&gt;
            ZIT = &amp;#039;&amp;lt;&amp;#039;:DICT.TITL(XX):&amp;#039;&amp;gt;&amp;#039;:ZIT:&amp;#039;&amp;lt;/&amp;#039;:DICT.TITL(XX):&amp;#039;&amp;gt;&amp;#039;&lt;br /&gt;
            LINE = T1:ZIT&lt;br /&gt;
            GOSUB WRITE.LINE; IF BAD THEN RETURN&lt;br /&gt;
         NEXT ZZ&lt;br /&gt;
      NEXT YY&lt;br /&gt;
*&lt;br /&gt;
* Process the grouped data&lt;br /&gt;
      FOR GG = 1 TO GGCNT&lt;br /&gt;
         MAT GDAT = &amp;#039;&amp;#039;&lt;br /&gt;
         IICNT = 0&lt;br /&gt;
         HHCNT = DCOUNT(GRPS&amp;lt;GG&amp;gt;,@VM)&lt;br /&gt;
         FOR HH = 1 TO HHCNT&lt;br /&gt;
            XX = GRPS&amp;lt;GG,HH&amp;gt;&lt;br /&gt;
            IF DICT.TYPE(XX) EQ &amp;#039;D&amp;#039; THEN&lt;br /&gt;
               IF DICT.RECS(XX)&amp;lt;2&amp;gt; EQ &amp;#039;0&amp;#039; THEN&lt;br /&gt;
                  BIT = @ID&lt;br /&gt;
               END ELSE BIT = REC&amp;lt;DICT.RECS(XX)&amp;lt;2&amp;gt;&amp;gt;&lt;br /&gt;
            END ELSE&lt;br /&gt;
               BIT = ITYPE(DICT.RECS(XX))&lt;br /&gt;
            END&lt;br /&gt;
            GDAT(HH) = RAISE(BIT)&lt;br /&gt;
            INUM = DCOUNT(GDAT(HH),@AM)&lt;br /&gt;
            IF INUM GT IICNT THEN IICNT = INUM&lt;br /&gt;
         NEXT HH&lt;br /&gt;
         WRAPPER = &amp;#039;&amp;#039;&lt;br /&gt;
         TITLE = GRP.TITLE&amp;lt;GG&amp;gt;&lt;br /&gt;
         WIT = &amp;#039;&amp;#039;&lt;br /&gt;
         IF INDEX(TITLE,&amp;#039; &amp;#039;,1) THEN&lt;br /&gt;
            WRAPPER = FIELD(TITLE,&amp;#039; &amp;#039;,1)&lt;br /&gt;
            TITLE = FIELD(TITLE,&amp;#039; &amp;#039;,2)&lt;br /&gt;
            WIT = T1&lt;br /&gt;
         END&lt;br /&gt;
* Cater for the special case where there is only one in the group&lt;br /&gt;
* when we have an enclosing wrapper rather than a repeating title&lt;br /&gt;
         IF HHCNT EQ 1 AND WRAPPER EQ &amp;#039;&amp;#039; THEN&lt;br /&gt;
            WRAPPER = TITLE&lt;br /&gt;
            TITLE = &amp;#039;&amp;#039;&lt;br /&gt;
         END&lt;br /&gt;
         SAVETITLE = TITLE&lt;br /&gt;
         SAVEWRAPPER = WRAPPER&lt;br /&gt;
         FOR II = 1 TO IICNT&lt;br /&gt;
            TITLE = SAVETITLE&lt;br /&gt;
            FOR HH = 1 TO HHCNT&lt;br /&gt;
               XX = GRPS&amp;lt;GG,HH&amp;gt;&lt;br /&gt;
* Again, subvalues are ignored&lt;br /&gt;
               ZIT = GDAT(HH)&amp;lt;II,1&amp;gt;&lt;br /&gt;
               IF DICT.CONV(XX) NE &amp;#039;&amp;#039; THEN ZIT = OCONV(ZIT,DICT.CONV(XX))&lt;br /&gt;
               IF ZIT NE &amp;#039;&amp;#039; THEN&lt;br /&gt;
                  IF WRAPPER NE &amp;#039;&amp;#039; THEN&lt;br /&gt;
                     LINE = T1:&amp;#039;&amp;lt;&amp;#039;:WRAPPER:&amp;#039;&amp;gt;&amp;#039;&lt;br /&gt;
                     GOSUB WRITE.LINE; IF BAD THEN RETURN&lt;br /&gt;
                     WRAPPER = &amp;#039;&amp;#039;&lt;br /&gt;
                  END&lt;br /&gt;
                  IF TITLE NE &amp;#039;&amp;#039; THEN&lt;br /&gt;
                     LINE = WIT:T1:&amp;#039;&amp;lt;&amp;#039;:TITLE:&amp;#039;&amp;gt;&amp;#039;; TITLE = &amp;#039;&amp;#039;&lt;br /&gt;
                     GOSUB WRITE.LINE; IF BAD THEN RETURN&lt;br /&gt;
                  END&lt;br /&gt;
                  FRAG = ZIT; GOSUB CHANGE.CHARS; ZIT = FRAG&lt;br /&gt;
                  ZIT = &amp;#039;&amp;lt;&amp;#039;:DICT.TITL(XX):&amp;#039;&amp;gt;&amp;#039;:ZIT:&amp;#039;&amp;lt;/&amp;#039;:DICT.TITL(XX):&amp;#039;&amp;gt;&amp;#039;&lt;br /&gt;
                  LINE = WIT:T2:ZIT&lt;br /&gt;
                  GOSUB WRITE.LINE; IF BAD THEN RETURN&lt;br /&gt;
               END&lt;br /&gt;
            NEXT HH&lt;br /&gt;
            IF TITLE EQ &amp;#039;&amp;#039; AND SAVETITLE NE &amp;#039;&amp;#039; THEN&lt;br /&gt;
               LINE = WIT:T1:&amp;#039;&amp;lt;/&amp;#039;:SAVETITLE:&amp;#039;&amp;gt;&amp;#039;&lt;br /&gt;
               GOSUB WRITE.LINE; IF BAD THEN RETURN&lt;br /&gt;
            END&lt;br /&gt;
         NEXT II&lt;br /&gt;
         IF WRAPPER EQ &amp;#039;&amp;#039; AND SAVEWRAPPER NE &amp;#039;&amp;#039; THEN&lt;br /&gt;
            LINE = T1:&amp;#039;&amp;lt;/&amp;#039;:SAVEWRAPPER:&amp;#039;&amp;gt;&amp;#039;&lt;br /&gt;
            GOSUB WRITE.LINE; IF BAD THEN RETURN&lt;br /&gt;
         END&lt;br /&gt;
      NEXT GG&lt;br /&gt;
      LINE = &amp;#039;&amp;lt;/item&amp;gt;&amp;#039;&lt;br /&gt;
      GOSUB WRITE.LINE&lt;br /&gt;
      RETURN&lt;br /&gt;
*&lt;br /&gt;
OUTPUT.XML:&lt;br /&gt;
***********&lt;br /&gt;
      IF NOT(QUIET) THEN CRT @(-1):COMD; CRT; CRT&lt;br /&gt;
      IF OUTPUT = &amp;#039;XSL&amp;#039; THEN&lt;br /&gt;
         LINE = &amp;#039;&amp;lt;?&amp;#039;:VERSION:&amp;#039;?&amp;gt;&amp;#039;&lt;br /&gt;
         OUTPUT = &amp;#039;XML&amp;#039;&lt;br /&gt;
         GOSUB WRITE.LINE; IF BAD THEN STOP&lt;br /&gt;
         LINE = &amp;#039;&amp;lt;?xml-stylesheet type=&amp;quot;text/xsl&amp;quot; href=&amp;quot;&amp;#039;&lt;br /&gt;
         LINE := [[TYPE19ITEM]]:&amp;#039;.XSL&amp;quot;?&amp;gt;&amp;#039;&lt;br /&gt;
      END ELSE&lt;br /&gt;
         LINE = &amp;#039;&amp;lt;?&amp;#039;:VERSION:&amp;#039; standalone=&amp;quot;yes&amp;quot;?&amp;gt;&amp;#039;&lt;br /&gt;
      END&lt;br /&gt;
      GOSUB WRITE.LINE; IF BAD THEN STOP&lt;br /&gt;
      LINE = T1:&amp;#039;&amp;lt;!-- XML from &amp;#039;:@PATH:&amp;#039; at &amp;#039;:TIMEDATE()&lt;br /&gt;
      LINE := &amp;#039; by &amp;#039;:@LOGNAME:&amp;#039; - Original line as below --&amp;gt;&amp;#039;&lt;br /&gt;
      GOSUB WRITE.LINE; IF BAD THEN STOP&lt;br /&gt;
      LINE = T1:&amp;#039;&amp;lt;!-- &amp;#039;:@SENTENCE:&amp;#039; --&amp;gt;&amp;#039;&lt;br /&gt;
      GOSUB WRITE.LINE; IF BAD THEN STOP&lt;br /&gt;
      LINE = &amp;#039;&amp;lt;file id=&amp;quot;&amp;#039;:XMLNAME:&amp;#039;&amp;quot;&amp;gt;&amp;#039;&lt;br /&gt;
      GOSUB WRITE.LINE; IF BAD THEN STOP&lt;br /&gt;
      IF NOT(TOTCNT) THEN SELECT IFILE&lt;br /&gt;
      EOF = @FALSE&lt;br /&gt;
      LOOP&lt;br /&gt;
         READNEXT @ID ELSE EOF = @TRUE&lt;br /&gt;
      UNTIL EOF&lt;br /&gt;
*LOOP WHILE READNEXT @ID DO&lt;br /&gt;
         CNTR += 1&lt;br /&gt;
         IF SHOW THEN&lt;br /&gt;
            NEW.PCT = INT((CNTR*100)[[/TOTCNT]])&lt;br /&gt;
            IF NEW.PCT NE OLD.PCT THEN&lt;br /&gt;
               percent = NEW.PCT&lt;br /&gt;
               caption = &amp;#039;PREPARING FILE &amp;quot;&amp;#039;:[[TYPE19ITEM]]:&amp;#039;&amp;quot;&amp;#039;&lt;br /&gt;
               GOSUB GRAPH&lt;br /&gt;
            END&lt;br /&gt;
            OLD.PCT = NEW.PCT&lt;br /&gt;
         END ELSE&lt;br /&gt;
            IF NOT(QUIET) THEN&lt;br /&gt;
               IF NOT(REM(CNTR,100)) THEN CRT @(0):CNTR:&lt;br /&gt;
            END&lt;br /&gt;
         END&lt;br /&gt;
         READ @RECORD FROM IFILE, @ID THEN GOSUB PACK.ITEM&lt;br /&gt;
         IF BAD THEN STOP&lt;br /&gt;
      REPEAT&lt;br /&gt;
      LINE = &amp;#039;&amp;lt;/file&amp;gt;&amp;#039;; GOSUB WRITE.LINE; IF BAD THEN STOP&lt;br /&gt;
      IF NOT(SHOW OR QUIET) THEN CRT @(-1):CNTR:&lt;br /&gt;
      RETURN&lt;br /&gt;
*&lt;br /&gt;
OUTPUT.DTD:&lt;br /&gt;
***********&lt;br /&gt;
      LINES = &amp;#039;&amp;#039;&lt;br /&gt;
      LINES&amp;lt;-1&amp;gt; = &amp;#039;&amp;lt;?&amp;#039;:VERSION:&amp;#039; standalone=&amp;quot;yes&amp;quot;?&amp;gt;&amp;#039;&lt;br /&gt;
      LINES&amp;lt;-1&amp;gt; = &amp;#039;&amp;lt;!--&amp;#039;&lt;br /&gt;
      LINES&amp;lt;-1&amp;gt; = T1:&amp;#039;This is the DTD for the command&amp;#039;&lt;br /&gt;
      LINES&amp;lt;-1&amp;gt; = T1:@SENTENCE&lt;br /&gt;
      LINES&amp;lt;-1&amp;gt; = &amp;#039;--&amp;gt;&amp;#039;&lt;br /&gt;
      LINES&amp;lt;-1&amp;gt; = &amp;#039;&amp;lt;!ELEMENT file (item)&amp;gt;&amp;#039;&lt;br /&gt;
      LINES&amp;lt;-1&amp;gt; = &amp;#039;&amp;lt;!ATTLIST file id CDATA #REQUIRED&amp;gt;&amp;#039;&lt;br /&gt;
      LINES&amp;lt;-1&amp;gt; = &amp;#039;&amp;lt;!ELEMENT item&amp;#039;&lt;br /&gt;
      BIT = &amp;#039; (&amp;#039;&lt;br /&gt;
* Show tags&lt;br /&gt;
      YYCNT = DCOUNT(TAGS,@AM)&lt;br /&gt;
      FOR YY = 1 TO YYCNT&lt;br /&gt;
         XX = TAGS&amp;lt;YY&amp;gt;&lt;br /&gt;
         LINES := BIT:DICT.TITL(XX):&amp;#039;*&amp;#039;&lt;br /&gt;
         BIT = &amp;#039;, &amp;#039;&lt;br /&gt;
      NEXT YY&lt;br /&gt;
* Show Groups&lt;br /&gt;
      YYCNT = DCOUNT(GROUPS,@AM)&lt;br /&gt;
      FOR YY = 1 TO YYCNT&lt;br /&gt;
         LINES := BIT:FIELD(GROUPS&amp;lt;YY&amp;gt;,&amp;#039; &amp;#039;,1):&amp;#039;*&amp;#039;&lt;br /&gt;
         BIT = &amp;#039;, &amp;#039;&lt;br /&gt;
      NEXT YY&lt;br /&gt;
      IF BIT = &amp;#039;, &amp;#039; THEN LINES := &amp;#039;)&amp;#039;&lt;br /&gt;
      LINES := &amp;#039;&amp;gt;&amp;#039;&lt;br /&gt;
* Show id&lt;br /&gt;
      LINES&amp;lt;-1&amp;gt; = &amp;#039;&amp;lt;!ATTLIST item id&amp;#039;:T1:&amp;#039;CDATA #REQUIRED&amp;#039;&lt;br /&gt;
      YYCNT = DCOUNT(ATTS,@AM)&lt;br /&gt;
      IF YYCNT THEN&lt;br /&gt;
* Loop doing each ATT&lt;br /&gt;
         FOR YY = 1 TO YYCNT&lt;br /&gt;
            XX = ATTS&amp;lt;YY&amp;gt;&lt;br /&gt;
            LINES&amp;lt;-1&amp;gt; = SPACE(15):DICT.TITL(XX):T1:&amp;#039;CDATA #&amp;#039;&lt;br /&gt;
            IF KILL THEN LINES := &amp;#039;IMPLIED&amp;#039; ELSE LINES := &amp;#039;REQUIRED&amp;#039;&lt;br /&gt;
            IF YY EQ YYCNT THEN LINES := &amp;#039;&amp;gt;&amp;#039;&lt;br /&gt;
         NEXT YY&lt;br /&gt;
      END ELSE&lt;br /&gt;
         LINES := &amp;#039;&amp;gt;&amp;#039;&lt;br /&gt;
      END&lt;br /&gt;
* Loop doing each TAG&lt;br /&gt;
      YYCNT = DCOUNT(TAGS,@AM)&lt;br /&gt;
      FOR YY = 1 TO YYCNT&lt;br /&gt;
         XX = TAGS&amp;lt;YY&amp;gt;&lt;br /&gt;
         LINES&amp;lt;-1&amp;gt; = &amp;#039;&amp;lt;!ELEMENT &amp;#039;:DICT.TITL(XX):&amp;#039; (#PCDATA)&amp;gt;&amp;#039;&lt;br /&gt;
      NEXT YY&lt;br /&gt;
* Loop doing each group item&lt;br /&gt;
      GGCNT = DCOUNT(GRPS,@AM)&lt;br /&gt;
      FOR GG = 1 TO GGCNT&lt;br /&gt;
         GNAME = GROUPS&amp;lt;GG&amp;gt;&lt;br /&gt;
         IF INDEX(GNAME,&amp;#039; &amp;#039;,1) THEN&lt;br /&gt;
            LINES&amp;lt;-1&amp;gt; = &amp;#039;&amp;lt;!ELEMENT &amp;#039;:FIELD(GNAME,&amp;#039; &amp;#039;,1):&amp;#039; (&amp;#039;&lt;br /&gt;
            LINES := FIELD(GNAME,&amp;#039; &amp;#039;,2):&amp;#039;*)&amp;gt;&amp;#039;&lt;br /&gt;
            GNAME = FIELD(GNAME,&amp;#039; &amp;#039;,2)&lt;br /&gt;
         END&lt;br /&gt;
         HHCNT = DCOUNT(GRPS&amp;lt;GG&amp;gt;,@VM)&lt;br /&gt;
         LINES&amp;lt;-1&amp;gt; = &amp;#039;&amp;lt;!ELEMENT &amp;#039;:GNAME:&amp;#039; &amp;#039;&lt;br /&gt;
         BIT = &amp;#039;(&amp;#039;&lt;br /&gt;
         FOR HH = 1 TO HHCNT&lt;br /&gt;
            XX = GRPS&amp;lt;GG,HH&amp;gt;&lt;br /&gt;
            LINES := BIT:DICT.TITL(XX):&amp;#039;*&amp;#039;&lt;br /&gt;
            BIT = &amp;#039;, &amp;#039;&lt;br /&gt;
         NEXT HH&lt;br /&gt;
         LINES := &amp;#039;)&amp;gt;&amp;#039;&lt;br /&gt;
         FOR HH = 1 TO HHCNT&lt;br /&gt;
            XX = GRPS&amp;lt;GG,HH&amp;gt;&lt;br /&gt;
            LINES&amp;lt;-1&amp;gt; = &amp;#039;&amp;lt;!ELEMENT &amp;#039;:DICT.TITL(XX):&amp;#039; (#PCDATA)&amp;gt;&amp;#039;&lt;br /&gt;
         NEXT HH&lt;br /&gt;
      NEXT GG&lt;br /&gt;
      GOSUB WRITE.LINES&lt;br /&gt;
      RETURN&lt;br /&gt;
*&lt;br /&gt;
OUTPUT.SCHEMA:&lt;br /&gt;
**************&lt;br /&gt;
      LINES = &amp;#039;&amp;#039;&lt;br /&gt;
      LINES&amp;lt;-1&amp;gt; = &amp;#039;&amp;lt;?&amp;#039;:VERSION:&amp;#039; standalone=&amp;quot;yes&amp;quot;?&amp;gt;&amp;#039;&lt;br /&gt;
      LINES&amp;lt;-1&amp;gt; = @AM&lt;br /&gt;
* Documentation&lt;br /&gt;
      LINES&amp;lt;-1&amp;gt; = &amp;#039;&amp;lt;xsd:schema &amp;#039;&lt;br /&gt;
      LINES := &amp;#039;xmlns:xsd=&amp;quot;http://www.w3.org/2000/10/XMLSchema&amp;quot;&amp;gt;&amp;#039;&lt;br /&gt;
      LINES&amp;lt;-1&amp;gt; = &amp;#039;&amp;lt;xsd:annotation&amp;gt;&amp;#039;&lt;br /&gt;
      LINES&amp;lt;-1&amp;gt; = T1:&amp;#039;&amp;lt;xsd:documentation&amp;gt;&amp;#039;&lt;br /&gt;
      LINES&amp;lt;-1&amp;gt; = T2:&amp;#039;This is the SCHEMA for the command&amp;#039;&lt;br /&gt;
      LINES&amp;lt;-1&amp;gt; = T2:@SENTENCE&lt;br /&gt;
      LINES&amp;lt;-1&amp;gt; = T1:&amp;#039;&amp;lt;/xsd:documentation&amp;gt;&amp;#039;&lt;br /&gt;
      LINES&amp;lt;-1&amp;gt; = &amp;#039;&amp;lt;/xsd:annotation&amp;gt;&amp;#039;&lt;br /&gt;
      LINES&amp;lt;-1&amp;gt; = @AM&lt;br /&gt;
* file&lt;br /&gt;
      LINES&amp;lt;-1&amp;gt; = &amp;#039;&amp;lt;xsd:element name=&amp;quot;file&amp;quot; type=&amp;quot;[[FileType]]&amp;quot;/&amp;gt;&amp;#039;&lt;br /&gt;
      LINES&amp;lt;-1&amp;gt; = &amp;#039;&amp;lt;xsd:complexType name=&amp;quot;[[FileType]]&amp;quot;&amp;#039;&lt;br /&gt;
      LINES&amp;lt;-1&amp;gt; = T1:&amp;#039;&amp;lt;xsd:sequence&amp;gt;&amp;#039;&lt;br /&gt;
      LINES&amp;lt;-1&amp;gt; = T2:&amp;#039;&amp;lt;xsd:element name=&amp;quot;item&amp;quot; type=&amp;quot;[[ItemType]]&amp;quot;/&amp;gt;&amp;#039;&lt;br /&gt;
      LINES&amp;lt;-1&amp;gt; = T1:&amp;#039;&amp;lt;/xsd:sequence&amp;gt;&amp;#039;&lt;br /&gt;
      LINES&amp;lt;-1&amp;gt; = T1:&amp;#039;&amp;lt;xsd:attribute name=&amp;quot;id&amp;quot; use=&amp;quot;required&amp;quot;&amp;#039;&lt;br /&gt;
      LINES := &amp;#039; type=&amp;quot;xsd:string&amp;quot;/&amp;gt;&amp;#039;&lt;br /&gt;
      LINES&amp;lt;-1&amp;gt; = &amp;#039;&amp;lt;/xsd:complexType&amp;gt;&amp;#039;&lt;br /&gt;
      LINES&amp;lt;-1&amp;gt; = @AM&lt;br /&gt;
* item&lt;br /&gt;
      LINES&amp;lt;-1&amp;gt; = &amp;#039;&amp;lt;xsd:complexType name=&amp;quot;[[ItemType]]&amp;quot;&amp;#039;&lt;br /&gt;
* Show tags and groups&lt;br /&gt;
      IF TAGS NE &amp;#039;&amp;#039; OR GROUPS NE &amp;#039;&amp;#039; THEN&lt;br /&gt;
         LINES&amp;lt;-1&amp;gt; = T1:&amp;#039;&amp;lt;xsd:sequence&amp;gt;&amp;#039;&lt;br /&gt;
      END&lt;br /&gt;
* Show tags&lt;br /&gt;
      YYCNT = DCOUNT(TAGS,@AM)&lt;br /&gt;
      FOR YY = 1 TO YYCNT&lt;br /&gt;
         XX = TAGS&amp;lt;YY&amp;gt;&lt;br /&gt;
         LINES&amp;lt;-1&amp;gt; = T2:&amp;#039;&amp;lt;xsd:element name=&amp;quot;&amp;#039;&lt;br /&gt;
         LINES := DICT.TITL(XX):&amp;#039;&amp;quot; type=&amp;quot;xsd:string&amp;quot;/&amp;gt;&amp;#039;&lt;br /&gt;
      NEXT YY&lt;br /&gt;
* Show groups referring to them as complex types&lt;br /&gt;
      YYCNT = DCOUNT(GROUPS,@AM)&lt;br /&gt;
      FOR YY = 1 TO YYCNT&lt;br /&gt;
         GNAME = FIELD(GROUPS&amp;lt;YY&amp;gt;,&amp;#039; &amp;#039;,1)&lt;br /&gt;
         LINES&amp;lt;-1&amp;gt; = T2:&amp;#039;&amp;lt;xsd:element name=&amp;quot;&amp;#039;:GNAME:&amp;#039;&amp;quot; &amp;#039;&lt;br /&gt;
         LINES := &amp;#039;type=&amp;quot;&amp;#039;:GNAME:&amp;#039;Type&amp;quot;/&amp;gt;&amp;#039;&lt;br /&gt;
      NEXT YY&lt;br /&gt;
      IF TAGS NE &amp;#039;&amp;#039; OR GROUPS NE &amp;#039;&amp;#039; THEN&lt;br /&gt;
         LINES&amp;lt;-1&amp;gt; = T1:&amp;#039;&amp;lt;/xsd:sequence&amp;gt;&amp;#039;&lt;br /&gt;
      END&lt;br /&gt;
* id attribute&lt;br /&gt;
      LINES&amp;lt;-1&amp;gt; = T1:&amp;#039;&amp;lt;xsd:attribute name=&amp;quot;id&amp;quot; use=&amp;quot;required&amp;quot;&amp;#039;&lt;br /&gt;
      LINES := &amp;#039; type=&amp;quot;xsd:string&amp;quot;/&amp;gt;&amp;#039;&lt;br /&gt;
* Show attributes&lt;br /&gt;
      YYCNT = DCOUNT(ATTS,@AM)&lt;br /&gt;
      FOR YY = 1 TO YYCNT&lt;br /&gt;
         XX = ATTS&amp;lt;YY&amp;gt;&lt;br /&gt;
         LINES&amp;lt;-1&amp;gt; = T1:&amp;#039;&amp;lt;xsd:attribute name=&amp;quot;&amp;#039;:DICT.TITL(XX):&amp;#039;&amp;quot;&amp;#039;&lt;br /&gt;
         IF NOT(KILL) THEN LINES := &amp;#039; use=&amp;quot;required&amp;quot;&amp;#039;&lt;br /&gt;
         LINES := &amp;#039; type=&amp;quot;xsd:string&amp;quot;/&amp;gt;&amp;#039;&lt;br /&gt;
      NEXT YY&lt;br /&gt;
      LINES&amp;lt;-1&amp;gt; = &amp;#039;&amp;lt;/xsd:complexType&amp;gt;&amp;#039;&lt;br /&gt;
      LINES&amp;lt;-1&amp;gt; = @AM&lt;br /&gt;
* Show any second level groups as complex types also&lt;br /&gt;
      YYCNT = DCOUNT(GROUPS,@AM)&lt;br /&gt;
      FOR YY = 1 TO YYCNT&lt;br /&gt;
         GNAME = FIELD(GROUPS&amp;lt;YY&amp;gt;,&amp;#039; &amp;#039;,2)&lt;br /&gt;
         IF GNAME NE &amp;#039;&amp;#039; THEN&lt;br /&gt;
            LINES&amp;lt;-1&amp;gt; = &amp;#039;&amp;lt;xsd:complexType name=&amp;quot;&amp;#039;&lt;br /&gt;
            LINES := FIELD(GROUPS&amp;lt;YY&amp;gt;,&amp;#039; &amp;#039;,1):&amp;#039;Type&amp;quot;&amp;gt;&amp;#039;&lt;br /&gt;
            LINES&amp;lt;-1&amp;gt; = T1:&amp;#039;&amp;lt;xsd:sequence&amp;gt;&amp;#039;&lt;br /&gt;
            LINES&amp;lt;-1&amp;gt; = T2:&amp;#039;&amp;lt;xsd:element name=&amp;quot;&amp;#039;:GNAME:&amp;#039;&amp;quot; &amp;#039;&lt;br /&gt;
            LINES := &amp;#039;type=&amp;quot;&amp;#039;:GNAME:&amp;#039;Type&amp;quot;/&amp;gt;&amp;#039;&lt;br /&gt;
            LINES&amp;lt;-1&amp;gt; = T1:&amp;#039;&amp;lt;/xsd:sequence&amp;gt;&amp;#039;&lt;br /&gt;
            LINES&amp;lt;-1&amp;gt; = &amp;#039;&amp;lt;/xsd:complexType&amp;gt;&amp;#039;&lt;br /&gt;
            LINES&amp;lt;-1&amp;gt; = @AM&lt;br /&gt;
         END&lt;br /&gt;
      NEXT YY&lt;br /&gt;
* Loop doing each group item&lt;br /&gt;
      GGCNT = DCOUNT(GRPS,@AM)&lt;br /&gt;
      FOR GG = 1 TO GGCNT&lt;br /&gt;
         GNAME = GROUPS&amp;lt;GG&amp;gt;&lt;br /&gt;
         IF INDEX(GNAME,&amp;#039; &amp;#039;,1) THEN GNAME = FIELD(GNAME,&amp;#039; &amp;#039;,2)&lt;br /&gt;
         LINES&amp;lt;-1&amp;gt; = &amp;#039;&amp;lt;xsd:complexType name=&amp;quot;&amp;#039;:GNAME:&amp;#039;Type&amp;quot;&amp;gt;&amp;#039;&lt;br /&gt;
         HHCNT = DCOUNT(GRPS&amp;lt;GG&amp;gt;,@VM)&lt;br /&gt;
         FOR HH = 1 TO HHCNT&lt;br /&gt;
            XX = GRPS&amp;lt;GG,HH&amp;gt;&lt;br /&gt;
            LINES&amp;lt;-1&amp;gt; = T1:&amp;#039;&amp;lt;xsd:element name=&amp;quot;&amp;#039;:DICT.TITL(XX)&lt;br /&gt;
            LINES := &amp;#039;&amp;quot; type=&amp;quot;xsd:string&amp;quot;/&amp;gt;&amp;#039;&lt;br /&gt;
         NEXT HH&lt;br /&gt;
         LINES&amp;lt;-1&amp;gt; = &amp;#039;&amp;lt;/xsd:complexType&amp;gt;&amp;#039;&lt;br /&gt;
         LINES&amp;lt;-1&amp;gt; = @AM&lt;br /&gt;
      NEXT GG&lt;br /&gt;
      LINES&amp;lt;-1&amp;gt; = &amp;#039;&amp;lt;/xsd:schema&amp;gt;&amp;#039;&lt;br /&gt;
      GOSUB WRITE.LINES&lt;br /&gt;
      RETURN&lt;br /&gt;
*&lt;br /&gt;
OUTPUT.XSL:&lt;br /&gt;
***********&lt;br /&gt;
* Generic header&lt;br /&gt;
      LINES = &amp;#039;&amp;#039;&lt;br /&gt;
      LINES&amp;lt;-1&amp;gt; = &amp;#039;&amp;lt;?&amp;#039;:VERSION:&amp;#039; standalone=&amp;quot;yes&amp;quot;?&amp;gt;&amp;#039;&lt;br /&gt;
      LINES&amp;lt;-1&amp;gt; = &amp;#039;&amp;lt;xsl:stylesheet &amp;#039;&lt;br /&gt;
      LINES := &amp;#039;xmlns:xsl=&amp;quot;http://www.w3.org/TR/WD-xsl&amp;quot;&amp;gt;&amp;#039;&lt;br /&gt;
      LINES&amp;lt;-1&amp;gt; = @AM&lt;br /&gt;
      LINES&amp;lt;-1&amp;gt; = &amp;#039;&amp;lt;xsl:template match=&amp;quot;/&amp;quot;&amp;gt;&amp;#039;&lt;br /&gt;
      LINES&amp;lt;-1&amp;gt; = &amp;#039;&amp;lt;html&amp;gt;&amp;#039;&lt;br /&gt;
      LINES&amp;lt;-1&amp;gt; = T1:&amp;#039;&amp;lt;head&amp;gt;&amp;#039;&lt;br /&gt;
      LINES&amp;lt;-1&amp;gt; = T2:&amp;#039;&amp;lt;style&amp;gt;body,h1,h2,h3 &amp;#039;&lt;br /&gt;
      LINES := &amp;#039;{ font-family: Tahoma,Arial,Helvetica; } &amp;#039;&lt;br /&gt;
      LINES := &amp;#039;thead { text-align: left; } &amp;#039;&lt;br /&gt;
      LINES := &amp;#039;tr { margin-top: 2px; } &amp;#039;&lt;br /&gt;
      LINES := &amp;#039;thead { background-color: Black; color: White; }&amp;lt;/style&amp;gt;&amp;#039;&lt;br /&gt;
      LINES&amp;lt;-1&amp;gt; = T2:&amp;#039;&amp;lt;title&amp;gt;File listing&amp;lt;/title&amp;gt;&amp;#039;&lt;br /&gt;
      LINES&amp;lt;-1&amp;gt; = T1:&amp;#039;&amp;lt;/head&amp;gt;&amp;#039;&lt;br /&gt;
      LINES&amp;lt;-1&amp;gt; = T1:&amp;#039;&amp;lt;body&amp;gt;&amp;#039;&lt;br /&gt;
      LINES&amp;lt;-1&amp;gt; = T2:&amp;#039;&amp;lt;xsl:apply-templates select=&amp;quot;*&amp;quot; /&amp;gt;&amp;#039;&lt;br /&gt;
      LINES&amp;lt;-1&amp;gt; = T1:&amp;#039;&amp;lt;/body&amp;gt;&amp;#039;&lt;br /&gt;
      LINES&amp;lt;-1&amp;gt; = &amp;#039;&amp;lt;/html&amp;gt;&amp;#039;&lt;br /&gt;
      LINES&amp;lt;-1&amp;gt; = &amp;#039;&amp;lt;/xsl:template&amp;gt;&amp;#039;&lt;br /&gt;
      LINES&amp;lt;-1&amp;gt; = @AM; GOSUB WRITE.LINES&lt;br /&gt;
      LINES&amp;lt;-1&amp;gt; = &amp;#039;&amp;lt;xsl:template match=&amp;quot;file&amp;quot;&amp;gt;&amp;#039;&lt;br /&gt;
      LINES&amp;lt;-1&amp;gt; = T1:&amp;#039;&amp;lt;h1&amp;gt;File name:&amp;#039;&lt;br /&gt;
      LINES := &amp;#039;&amp;lt;xsl:value-of select=&amp;quot;@id&amp;quot; /&amp;gt;&amp;#039;&lt;br /&gt;
      LINES := &amp;#039;&amp;lt;/h1&amp;gt;&amp;#039;&lt;br /&gt;
      LINES&amp;lt;-1&amp;gt; = T1:&amp;#039;&amp;lt;xsl:apply-templates select=&amp;quot;*&amp;quot; /&amp;gt;&amp;#039;&lt;br /&gt;
      LINES&amp;lt;-1&amp;gt; = &amp;#039;&amp;lt;/xsl:template&amp;gt;&amp;#039;&lt;br /&gt;
      LINES&amp;lt;-1&amp;gt; = @AM; GOSUB WRITE.LINES&lt;br /&gt;
&lt;br /&gt;
* item with id and attributes&lt;br /&gt;
      LINES&amp;lt;-1&amp;gt; = &amp;#039;&amp;lt;xsl:template match=&amp;quot;item&amp;quot;&amp;gt;&amp;#039;&lt;br /&gt;
      LINES&amp;lt;-1&amp;gt; = T1:&amp;#039;&amp;lt;h2&amp;gt;Item ID:&amp;#039;&lt;br /&gt;
      LINES := &amp;#039;&amp;lt;xsl:value-of select=&amp;quot;@id&amp;quot; /&amp;gt;&amp;#039;&lt;br /&gt;
      LINES := &amp;#039;&amp;lt;/h2&amp;gt;&amp;#039;&lt;br /&gt;
      LINES&amp;lt;-1&amp;gt; = T1:&amp;#039;&amp;lt;div style=&amp;quot;margin-left: 20px;&amp;quot;&amp;gt;&amp;#039;&lt;br /&gt;
* Loop doing each ATT&lt;br /&gt;
      YYCNT = DCOUNT(ATTS,@AM)&lt;br /&gt;
      FOR YY = 1 TO YYCNT&lt;br /&gt;
         XX = ATTS&amp;lt;YY&amp;gt;&lt;br /&gt;
         LINE = T1:&amp;#039;&amp;lt;h3&amp;gt;&amp;#039;:DICT.TITL(XX):&amp;#039; = &amp;quot;&amp;#039;&lt;br /&gt;
         LINE:= &amp;#039;&amp;lt;xsl:value-of select=&amp;quot;@&amp;#039;:DICT.TITL(XX):&amp;#039;&amp;quot; /&amp;gt;&amp;#039;&lt;br /&gt;
         LINE:= &amp;#039;&amp;quot;&amp;lt;/h3&amp;gt;&amp;#039;&lt;br /&gt;
         LINES&amp;lt;-1&amp;gt; = LINE&lt;br /&gt;
      NEXT YY&lt;br /&gt;
* Loop doing each TAG&lt;br /&gt;
      YYCNT = DCOUNT(TAGS,@AM)&lt;br /&gt;
      FOR YY = 1 TO YYCNT&lt;br /&gt;
         XX = TAGS&amp;lt;YY&amp;gt;&lt;br /&gt;
         LINES&amp;lt;-1&amp;gt; = T1:&amp;#039;&amp;lt;table&amp;gt;&amp;#039;&lt;br /&gt;
         LINES&amp;lt;-1&amp;gt; = T2:&amp;#039;&amp;lt;thead&amp;gt;&amp;#039;&lt;br /&gt;
         LINES&amp;lt;-1&amp;gt; = T3:&amp;#039;&amp;lt;th&amp;gt;&amp;#039;:DICT.TITL(XX):&amp;#039;&amp;lt;/th&amp;gt;&amp;#039;&lt;br /&gt;
         LINES&amp;lt;-1&amp;gt; = T2:&amp;#039;&amp;lt;/thead&amp;gt;&amp;#039;&lt;br /&gt;
         LINES&amp;lt;-1&amp;gt; = T2:&amp;#039;&amp;lt;tbody&amp;gt;&amp;#039;&lt;br /&gt;
         LINES&amp;lt;-1&amp;gt; = T3:&amp;#039;&amp;lt;xsl:apply-templates select=&amp;quot;&amp;#039;:DICT.TITL(XX):&amp;#039;&amp;quot;/&amp;gt;&amp;#039;&lt;br /&gt;
         LINES&amp;lt;-1&amp;gt; = T2:&amp;#039;&amp;lt;/tbody&amp;gt;&amp;#039;&lt;br /&gt;
         LINES&amp;lt;-1&amp;gt; = T1:&amp;#039;&amp;lt;/table&amp;gt;&amp;#039;&lt;br /&gt;
      NEXT YY&lt;br /&gt;
*&lt;br /&gt;
* Loop doing each group (multi-level groups just have a reference)&lt;br /&gt;
      GGCNT = DCOUNT(GROUPS,@AM)&lt;br /&gt;
      FOR GG = 1 TO GGCNT&lt;br /&gt;
         GNAME = GROUPS&amp;lt;GG&amp;gt;&lt;br /&gt;
         GSUBNAME = FIELD(GNAME,&amp;#039; &amp;#039;,2)&lt;br /&gt;
         GNAME = FIELD(GNAME,&amp;#039; &amp;#039;,1)&lt;br /&gt;
         IF GSUBNAME NE &amp;#039;&amp;#039; THEN&lt;br /&gt;
            LINES&amp;lt;-1&amp;gt; = T1:&amp;#039;&amp;lt;xsl:apply-templates select=&amp;quot;&amp;#039;:GNAME:&amp;#039;&amp;quot;/&amp;gt;&amp;#039;&lt;br /&gt;
         END ELSE&lt;br /&gt;
            HHCNT = DCOUNT(GRPS&amp;lt;GG&amp;gt;,@VM)&lt;br /&gt;
            LINES&amp;lt;-1&amp;gt; = T1:&amp;#039;&amp;lt;h3&amp;gt;&amp;#039;:GNAME:&amp;#039;&amp;lt;/h3&amp;gt;&amp;#039;&lt;br /&gt;
            LINES&amp;lt;-1&amp;gt; = T1:&amp;#039;&amp;lt;table&amp;gt;&amp;#039;&lt;br /&gt;
            LINES&amp;lt;-1&amp;gt; = T2:&amp;#039;&amp;lt;thead&amp;gt;&amp;#039;&lt;br /&gt;
            FOR HH = 1 TO HHCNT&lt;br /&gt;
               XX = GRPS&amp;lt;GG,HH&amp;gt;&lt;br /&gt;
               LINES&amp;lt;-1&amp;gt; = T3:&amp;#039;&amp;lt;th&amp;gt;&amp;#039;:DICT.TITL(XX):&amp;#039;&amp;lt;/th&amp;gt;&amp;#039;&lt;br /&gt;
            NEXT HH&lt;br /&gt;
            LINES&amp;lt;-1&amp;gt; = T2:&amp;#039;&amp;lt;/thead&amp;gt;&amp;#039;&lt;br /&gt;
            LINES&amp;lt;-1&amp;gt; = T2:&amp;#039;&amp;lt;tbody&amp;gt;&amp;#039;&lt;br /&gt;
            LINES&amp;lt;-1&amp;gt; = T3:&amp;#039;&amp;lt;xsl:apply-templates select=&amp;quot;&amp;#039;:GNAME:&amp;#039;&amp;quot;/&amp;gt;&amp;#039;&lt;br /&gt;
            LINES&amp;lt;-1&amp;gt; = T2:&amp;#039;&amp;lt;/tbody&amp;gt;&amp;#039;&lt;br /&gt;
            LINES&amp;lt;-1&amp;gt; = T1:&amp;#039;&amp;lt;/table&amp;gt;&amp;#039;&lt;br /&gt;
         END&lt;br /&gt;
      NEXT GG&lt;br /&gt;
      LINES&amp;lt;-1&amp;gt; = T1:&amp;#039;&amp;lt;/div&amp;gt;&amp;#039;&lt;br /&gt;
      LINES&amp;lt;-1&amp;gt; = &amp;#039;&amp;lt;/xsl:template&amp;gt;&amp;#039;&lt;br /&gt;
      LINES&amp;lt;-1&amp;gt; = @AM; GOSUB WRITE.LINES&lt;br /&gt;
&lt;br /&gt;
* Loop doing each TAG&lt;br /&gt;
      YYCNT = DCOUNT(TAGS,@AM)&lt;br /&gt;
      FOR YY = 1 TO YYCNT&lt;br /&gt;
         XX = TAGS&amp;lt;YY&amp;gt;&lt;br /&gt;
         LINES&amp;lt;-1&amp;gt; = &amp;#039;&amp;lt;xsl:template match=&amp;quot;&amp;#039;:DICT.TITL(XX):&amp;#039;&amp;quot;&amp;gt;&amp;#039;&lt;br /&gt;
         LINES&amp;lt;-1&amp;gt; = T1:&amp;#039;&amp;lt;xsl:for-each match=&amp;quot;.&amp;quot;&amp;gt;&amp;#039;&lt;br /&gt;
         LINES&amp;lt;-1&amp;gt; = T2:&amp;#039;&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;&amp;#039;&lt;br /&gt;
         LINES&amp;lt;-1&amp;gt; = T2:&amp;#039;&amp;lt;xsl:value-of select=&amp;quot;.&amp;quot;/&amp;gt;&amp;#039;&lt;br /&gt;
         LINES&amp;lt;-1&amp;gt; = T2:&amp;#039;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;#039;&lt;br /&gt;
         LINES&amp;lt;-1&amp;gt; = T1:&amp;#039;&amp;lt;/xsl:for-each&amp;gt;&amp;#039;&lt;br /&gt;
         LINES&amp;lt;-1&amp;gt; = &amp;#039;&amp;lt;/xsl:template&amp;gt;&amp;#039;&lt;br /&gt;
         LINES&amp;lt;-1&amp;gt; = @AM; GOSUB WRITE.LINES&lt;br /&gt;
      NEXT YY&lt;br /&gt;
&lt;br /&gt;
* Do each groups template&lt;br /&gt;
      GGCNT = DCOUNT(GROUPS,@AM)&lt;br /&gt;
      FOR GG = 1 TO GGCNT&lt;br /&gt;
         HHCNT = DCOUNT(GRPS&amp;lt;GG&amp;gt;,@VM)&lt;br /&gt;
         GNAME = GROUPS&amp;lt;GG&amp;gt;&lt;br /&gt;
         GSUBNAME = FIELD(GNAME,&amp;#039; &amp;#039;,2)&lt;br /&gt;
         GNAME = FIELD(GNAME,&amp;#039; &amp;#039;,1)&lt;br /&gt;
         LINES&amp;lt;-1&amp;gt; = &amp;#039;&amp;lt;xsl:template match=&amp;quot;&amp;#039;:GNAME:&amp;#039;&amp;quot;&amp;gt;&amp;#039;&lt;br /&gt;
         IF GSUBNAME = &amp;#039;&amp;#039; THEN&lt;br /&gt;
            GOSUB DO.TABLE&lt;br /&gt;
            LINES&amp;lt;-1&amp;gt; = &amp;#039;&amp;lt;/xsl:template&amp;gt;&amp;#039;&lt;br /&gt;
            LINES&amp;lt;-1&amp;gt; = @AM; GOSUB WRITE.LINES&lt;br /&gt;
         END ELSE&lt;br /&gt;
            LINES&amp;lt;-1&amp;gt; = T1:&amp;#039;&amp;lt;h3&amp;gt;&amp;#039;:GNAME:&amp;#039;&amp;lt;/h3&amp;gt;&amp;#039;&lt;br /&gt;
            LINES&amp;lt;-1&amp;gt; = T1:&amp;#039;&amp;lt;table&amp;gt;&amp;#039;&lt;br /&gt;
            LINES&amp;lt;-1&amp;gt; = T2:&amp;#039;&amp;lt;thead&amp;gt;&amp;#039;&lt;br /&gt;
            FOR HH = 1 TO HHCNT&lt;br /&gt;
               XX = GRPS&amp;lt;GG,HH&amp;gt;&lt;br /&gt;
               LINES&amp;lt;-1&amp;gt; = T3:&amp;#039;&amp;lt;th&amp;gt;&amp;#039;:DICT.TITL(XX):&amp;#039;&amp;lt;/th&amp;gt;&amp;#039;&lt;br /&gt;
            NEXT HH&lt;br /&gt;
            LINES&amp;lt;-1&amp;gt; = T2:&amp;#039;&amp;lt;/thead&amp;gt;&amp;#039;&lt;br /&gt;
            LINES&amp;lt;-1&amp;gt; = T2:&amp;#039;&amp;lt;tbody&amp;gt;&amp;#039;&lt;br /&gt;
            IF GSUBNAME NE &amp;#039;&amp;#039; THEN&lt;br /&gt;
               LINES&amp;lt;-1&amp;gt; = T3:&amp;#039;&amp;lt;xsl:apply-templates select=&amp;quot;*&amp;quot; /&amp;gt;&amp;#039;&lt;br /&gt;
            END ELSE&lt;br /&gt;
               GOSUB DO.TABLE&lt;br /&gt;
            END&lt;br /&gt;
            LINES&amp;lt;-1&amp;gt; = T2:&amp;#039;&amp;lt;/tbody&amp;gt;&amp;#039;&lt;br /&gt;
            LINES&amp;lt;-1&amp;gt; = T1:&amp;#039;&amp;lt;/table&amp;gt;&amp;#039;&lt;br /&gt;
            LINES&amp;lt;-1&amp;gt; = &amp;#039;&amp;lt;/xsl:template&amp;gt;&amp;#039;&lt;br /&gt;
            LINES&amp;lt;-1&amp;gt; = @AM; GOSUB WRITE.LINES&lt;br /&gt;
            LINES&amp;lt;-1&amp;gt; = &amp;#039;&amp;lt;xsl:template match=&amp;quot;&amp;#039;:GSUBNAME:&amp;#039;&amp;quot;&amp;gt;&amp;#039;&lt;br /&gt;
            LINES&amp;lt;-1&amp;gt; = T1:&amp;#039;&amp;lt;tr&amp;gt;&amp;#039;&lt;br /&gt;
            FOR HH = 1 TO HHCNT&lt;br /&gt;
               XX = GRPS&amp;lt;GG,HH&amp;gt;&lt;br /&gt;
               LINES&amp;lt;-1&amp;gt; = T2:&amp;#039;&amp;lt;td&amp;gt;&amp;lt;xsl:value-of select=&amp;quot;&amp;#039;&lt;br /&gt;
               LINES := DICT.TITL(XX):&amp;#039;&amp;quot;/&amp;gt;&amp;lt;/td&amp;gt;&amp;#039;&lt;br /&gt;
            NEXT HH&lt;br /&gt;
            LINES&amp;lt;-1&amp;gt; = T1:&amp;#039;&amp;lt;/tr&amp;gt;&amp;#039;&lt;br /&gt;
            LINES&amp;lt;-1&amp;gt; = &amp;#039;&amp;lt;/xsl:template&amp;gt;&amp;#039;&lt;br /&gt;
            LINES&amp;lt;-1&amp;gt; = @AM; GOSUB WRITE.LINES&lt;br /&gt;
         END&lt;br /&gt;
&lt;br /&gt;
      NEXT GG&lt;br /&gt;
&lt;br /&gt;
      LINES&amp;lt;-1&amp;gt; = &amp;#039;&amp;lt;/xsl:stylesheet&amp;gt;&amp;#039;&lt;br /&gt;
      GOSUB WRITE.LINES&lt;br /&gt;
      RETURN&lt;br /&gt;
*&lt;br /&gt;
DO.TABLE:&lt;br /&gt;
*********&lt;br /&gt;
      IF HHCNT = 1 THEN&lt;br /&gt;
         LINES&amp;lt;-1&amp;gt; = T1:&amp;#039;&amp;lt;xsl:for-each match=&amp;quot;.&amp;quot;&amp;gt;&amp;#039;&lt;br /&gt;
         LINES&amp;lt;-1&amp;gt; = T2:&amp;#039;&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;&amp;#039;&lt;br /&gt;
         LINES&amp;lt;-1&amp;gt; = T2:&amp;#039;&amp;lt;xsl:value-of select=&amp;quot;.&amp;quot;/&amp;gt;&amp;#039;&lt;br /&gt;
         LINES&amp;lt;-1&amp;gt; = T2:&amp;#039;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;#039;&lt;br /&gt;
         LINES&amp;lt;-1&amp;gt; = T1:&amp;#039;&amp;lt;/xsl:for-each&amp;gt;&amp;#039;&lt;br /&gt;
      END ELSE&lt;br /&gt;
         LINES&amp;lt;-1&amp;gt; = T1:&amp;#039;&amp;lt;tr&amp;gt;&amp;#039;&lt;br /&gt;
         FOR HH = 1 TO HHCNT&lt;br /&gt;
            XX = GRPS&amp;lt;GG,HH&amp;gt;&lt;br /&gt;
            LINES&amp;lt;-1&amp;gt; = T2:&amp;#039;&amp;lt;td&amp;gt;&amp;lt;xsl:value-of select=&amp;quot;&amp;#039;&lt;br /&gt;
            LINES := DICT.TITL(XX):&amp;#039;&amp;quot;/&amp;gt;&amp;lt;/td&amp;gt;&amp;#039;&lt;br /&gt;
         NEXT HH&lt;br /&gt;
         LINES&amp;lt;-1&amp;gt; = T1:&amp;#039;&amp;lt;/tr&amp;gt;&amp;#039;&lt;br /&gt;
      END&lt;br /&gt;
      RETURN&lt;br /&gt;
*&lt;br /&gt;
WRITE.LINES:&lt;br /&gt;
      LLCNT = DCOUNT(LINES,@AM)&lt;br /&gt;
      FOR LL = 1 TO LLCNT&lt;br /&gt;
         LINE = LINES&amp;lt;LL&amp;gt;&lt;br /&gt;
         GOSUB WRITE.LINE&lt;br /&gt;
         IF BAD THEN STOP&lt;br /&gt;
      NEXT LL&lt;br /&gt;
      LINES = &amp;#039;&amp;#039;&lt;br /&gt;
      RETURN&lt;br /&gt;
*&lt;br /&gt;
WRITE.LINE:&lt;br /&gt;
***********&lt;br /&gt;
      IF FIRST THEN&lt;br /&gt;
         IF [[TYPE19FILE]] NE &amp;#039;CRT&amp;#039; THEN&lt;br /&gt;
            WRITE LINE ON TRANSFER.FILE,[[TYPE19ITEM]]:&amp;#039;.&amp;#039;:OUTPUT&lt;br /&gt;
         END ELSE&lt;br /&gt;
            CRT LINE&lt;br /&gt;
         END&lt;br /&gt;
         FIRST = @FALSE&lt;br /&gt;
         IF [[TYPE19FILE]] NE &amp;#039;CRT&amp;#039; THEN&lt;br /&gt;
            OPENSEQ [[TYPE19FILE]],[[TYPE19ITEM]]:&amp;#039;.&amp;#039;:OUTPUT TO DEST ELSE&lt;br /&gt;
               CRT &amp;#039;Cannot OPENSEQ &amp;#039;:[[TYPE19ITEM]]:&amp;#039;.&amp;#039;:OUTPUT&lt;br /&gt;
               BAD = @TRUE&lt;br /&gt;
               RETURN&lt;br /&gt;
            END&lt;br /&gt;
         END ELSE RETURN&lt;br /&gt;
* Next line for Unidata?&lt;br /&gt;
* RETURN&lt;br /&gt;
      END&lt;br /&gt;
      IF [[TYPE19FILE]] NE &amp;#039;CRT&amp;#039; THEN&lt;br /&gt;
         WRITESEQ LINE ON DEST ELSE&lt;br /&gt;
* Replace above line with next on Unidata?&lt;br /&gt;
*        WRITESEQ LINE APPEND ON DEST ELSE&lt;br /&gt;
            CRT &amp;#039;Cannot WRITESEQ&amp;#039;&lt;br /&gt;
            BAD = @TRUE&lt;br /&gt;
         END&lt;br /&gt;
      END ELSE CRT LINE&lt;br /&gt;
      RETURN&lt;br /&gt;
*&lt;br /&gt;
GRAPH:&lt;br /&gt;
******&lt;br /&gt;
*SUBROUTINE GRAPH(percent,caption)&lt;br /&gt;
* S[[/R]] - SKR - Graph of % completion of a task&lt;br /&gt;
*&lt;br /&gt;
      CRT @(19,11):&amp;#039; |---|---|---|---|---|---|---|---|---|---| &amp;#039;:@(-4)&lt;br /&gt;
      CRT @(19,12):&amp;#039; 0 20 40 60 80 100&amp;#039;:@(-4)&lt;br /&gt;
      CRT @(19,13):&amp;#039; &amp;#039;:caption:@(-4)&lt;br /&gt;
      bar.length = INT(percent*40/100)&lt;br /&gt;
      bar = STR(&amp;#039; &amp;#039;,bar.length)&lt;br /&gt;
      CRT @(20,10):@(-13):bar:@(-14):percent:&amp;#039; %&amp;#039;:@(-4)&lt;br /&gt;
      RETURN&lt;br /&gt;
*&lt;br /&gt;
CHANGE.CHARS:&lt;br /&gt;
*************&lt;br /&gt;
      FRAG = CHANGE(FRAG,&amp;#039;&amp;amp;&amp;#039;,AMPERSAND:&amp;#039;amp;&amp;#039;)&lt;br /&gt;
      FRAG = CHANGE(FRAG,&amp;#039;&amp;lt;&amp;#039;,AMPERSAND:&amp;#039;lt;&amp;#039;)&lt;br /&gt;
      FRAG = CHANGE(FRAG,&amp;#039;&amp;gt;&amp;#039;,AMPERSAND:&amp;#039;gt;&amp;#039;)&lt;br /&gt;
      FRAG = CHANGE(FRAG,&amp;#039;&amp;quot;&amp;#039;,AMPERSAND:&amp;#039;quot;&amp;#039;)&lt;br /&gt;
      FRAG = CHANGE(FRAG,&amp;quot;&amp;#039;&amp;quot;,AMPERSAND:&amp;#039;039;&amp;#039;)&lt;br /&gt;
      RETURN&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Conversion script</name></author>
	</entry>
</feed>