.ANX (HotDocs XML) to HTML via XSLT Example

This is a reference sample of an XSL transform that can be used on any HotDocs XML style document. As you may know, A2J Guided Interviews output .ANX formatted XML. This transform converts the ANX file into an HTML table that lists all of the variables that were created by the A2J Guided Interview. Here is a sample ANX file generated by the Iowa Intake Interview that ask the user lots of questions about eligibility for legal aid:

 

As you can see, ANX XML uses a single element - "Answer" and puts the name of the variable into an attribute. The XSL transform looks like this:

 

Let's break it down so that you can see what is going on...

The first functional line ...

<xsl:template match="/AnswerSet">

 

... says that we are looking for the "AnswerSet" tag and anything inside it. That's pretty standard XQuery.

The next section of code ...

	<xsl:element name="table">
   <xsl:attribute name = "border" >1</xsl:attribute> 
   <xsl:attribute name = "cellpadding" >10</xsl:attribute> 
   <xsl:element name="tr">
   <xsl:element name="td">
   <xsl:text>#</xsl:text>
   </xsl:element> <!-- td --> 
   <xsl:element name="td">
   <xsl:text>variable name</xsl:text>
   </xsl:element> <!-- td --> 
   <xsl:element name="td">
   <xsl:text>type</xsl:text>
   </xsl:element> <!-- td --> 
   <xsl:element name="td">
   <xsl:text>value</xsl:text>
   </xsl:element> <!-- td --> 
   </xsl:element> <!-- tr --> 

 

Creates the output table with a border of 1, cellpadding of 10 and 4 columns with column headers of "#", 'Variable name", "type" and ""value".

The next section of code...

<xsl:for-each select="//Answer">

 

loops through all of the "Answer" tags found inside of the "AnswerSet" tag and this code ...

 <xsl:variable name="getanswers" select="position()"/>

 

... keeps a counter for the first column of the table. For every "Answer" tag found, we want to start a new row in the table. This is accomplished with the next section of code...

<xsl:element name="tr">
   <xsl:element name="td">
   <xsl:value-of select="$getanswers"/>
   </xsl:element> <!-- td --> 
   <xsl:element name="td">
   <xsl:value-of select="@name"/>
   </xsl:element> <!-- td --> 
   <xsl:element name="td">
 

The table row is output with the counter and variable name. Notice we are selecting for "@name" which gets us the attribute named "name". That is where variable name is in ANX XML. It's not in the tag since all of the tags are "Answer" tags. Now to get the type and value of the variable, we have to use an XSL case statement which is called a "Choose/When" in XSL. This section of code looks for the type of variable by looking for the tag names "RptValue", "TextValue", etc.

<xsl:choose>
   <xsl:when test="RptValue">
   <xsl:text>Multiple Text</xsl:text>
   </xsl:when>
   <xsl:when test="TextValue">
   <xsl:text>Text</xsl:text>
   </xsl:when>
   <xsl:when test="MCValue">
   <xsl:text>Multiple Choice</xsl:text>
   </xsl:when>
   <xsl:when test="NumValue">
   <xsl:text>Number</xsl:text>
   </xsl:when>
   <xsl:when test="TFValue">
   <xsl:text>True/False</xsl:text>
   </xsl:when>
   <xsl:when test="DateValue">
   <xsl:text>Date</xsl:text>
   </xsl:when>
   <xsl:otherwise>
   <xsl:text>otherwise</xsl:text>
   </xsl:otherwise>
   </xsl:choose>
   </xsl:element>

 

Getting the value of the variable is trivial at this point, since we are pointing at the variable, we use the "." shortcut notation.

 <xsl:element name="td">
   <xsl:value-of select="."/> 
   </xsl:element> <!-- td --> 
   </xsl:element> <!-- tr --> 

 

... The above code also closes off the table cell and the table row since we are all done with this variable.

This code closes the for-each loop ...

 </xsl:for-each> <!-- end of foreach for PersonInformation --> 

 

This code closes the table ...

 </xsl:element> <!-- table -->  

 

... and we are done.

Here is what the table looks like after the transform as run ...


# variable name type value
1 User Gender Multiple Choice Male
2 HOME_ADDRESS1 Text 111
3 HOME_ADDRESS2 Text  
4 HOME_CITY Text Akron
5 HOME_COUNTY Multiple Choice Adams
6 Problem Description TE Text  
7 User First Name TE Text John
8 Non Iowa TF True/False  
9 SSN NU Text 123-12-3123
10 Email TE Text jmayer@cali.org
11 Deadline TF True/False false
12 Hearing TF True/False false
13 OP HOME_ADDRESS1 Multiple Text 123 Maple
14 OP HOME_ADDRESS2 Multiple Text  
15 OP HOME_CITY Multiple Text Columbus
16 OP HOME_COUNTY Multiple Text  
17 OP HOME_STATE Multiple Text Ohio
18 User language TE Multiple Choice  
19 User Ethnicity TE Multiple Choice Hispanic and Black
20 Adult HH Member SSN NU Multiple Text 444-44-4444
21 Adult HH Member DOB NU Multiple Text 4/4/1984
22 English language TE True/False  
23 User Zip Code NU Text 44301
24 Citizenship MC Multiple Choice A
25 Problem Type TF Multiple Choice 1
26 Consumer MC Multiple Choice  
27 Benefits MC Multiple Choice  
28 Employment Problem MC Multiple Choice  
29 Income child support TF True/False true
30 Income disability TF True/False true
31 Income employment TF True/False true
32 Income farming TF True/False  
33 Income pension TF True/False true
34 Income self employment TF True/False  
35 Income SSI TF True/False true
36 Income social securty TF True/False  
37 Income unemployment TF True/False true
38 Income other 2 TF True/False true
39 Income no income TF True/False  
40 FIRST_NAME_OP TE Multiple Text Deefus
41 MIDDLE_NAME_OP TE Multiple Text dorfus
42 LAST_NAME_OP TE Multiple Text Doofus
43 Business Name OP TE Multiple Text  
44 Residence MC Multiple Choice Farm Labor Camp
45 Family problem MC Multiple Choice  
46 Housing Problem MC Multiple Choice  
47 Health Care MC Multiple Choice  
48 Marital Status MC Multiple Choice M
49 User Age NU Number 47
50 Adults served NU Number 2
51 Children served NU Number 3
52 User State MC Multiple Choice Ohio
53 Previous client MC Multiple Choice 101
54 User Home Phone NU Text (321) 321-3213
55 User Work Phone NU Text (432) 432-4324
56 User Cell Phone NU Text  
57 User Message phone NU Text  
58 User Middle Name TE Text Peter
59 User Last Name TE Text Mayer
60 OP NU Number  
61 No DeadlineTF True/False  
62 Handicapped TF True/False false
63 Other Party Zip NU Multiple Text  
64 PROBLEM_NU Text 1
65 CHILD_NU Text 4
66 ADULT_NU Text  
67 DISABILITY INCOME NU Number 111
68 Employment Income NU Number 22
69 Farm Income NU Number  
70 FIP Income NU Number  
71 Child Support NU Number 55
72 Veterans benefits NU Number 6
73 Self Employment Income NU Number 8
74 Pension Income NU Number 7
75 Alimony Income NU Number 44
76 SSI Income NU Number 11
77 Social Security Income NU Number 12
78 Unemployment Income NU Number 9
79 Workers Comp Income NU Number 10
80 Other Income NU Number 15
81 Checking Asset NU Number 21
82 Savings Asset NU Number 22
83 Real Property Asset NU Number 24
84 Second Vehicle NU Number 25
85 Cash Asset NU Number 23
86 Pension NU Number 28
87 Income Workers Comp TF True/False true
88 Checking TF True/False true
89 Savings TF True/False true
90 Cash TF True/False true
91 Non-homestead property TF True/False true
92 Additional motor vehicles TF True/False true
93 Personal property TF True/False true
94 Pension_Other TF True/False true
95 Personal Property NU Number 27
96 No Assets TF True/False false
97 Income alimony TF True/False true
98 CHILD_FIRST_NAME_TE Multiple Text ChildOneChildTwoChildThree
99 CHILD_MIDDLE_NAME Multiple Text  
100 CHILD_LAST_NAME Multiple Text MayerMayerMayer
101 User Birth date Date 6/4/1961
102 Child SSN Multiple Text 111-11-1111222-22-2222333-33-3333
103 Child DOB Multiple Text 2/1/20002/2/20003/3/2000
104 Unaccepted problem MC Multiple Choice  
105 FIRST_NAME_Adult_TE Multiple Text James
106 MIDDLE_NAME_Adult_TE Multiple Text asd
107 LAST_NAME_Adult_TE Multiple Text Mayer
108 Poverty Amount Text 9800
109 Asset Amount Text  
110 Income veterans benefits TF True/False true
111 User Avatar Text  
112 Green card number TE Text  
113 Additional Status Information TE Text  
114 Birth date Date  
115 Papers Received DA Date  
116 Received DA Date  
117 Case Number TE Text  
118 Court TE Text  
119 Hearing DA Date  
120 Hearing Time TE Multiple Choice  
121 Income OWF TF True/False true
122 Income self-employment TF True/False true
123 Income other 2 TE Text  
124 Income other TE Text  
125 INCOME_TOO_HIGH Text  
126 Abuse TF True/False false
127 No Deadline TF True/False  
128 Deadline Desc TL Text  
129 Deadline Desc TE Text  
130 Hearing Scheduled TF True/False  
131 Pension Problem MC Multiple Choice  
132 Other Housing TE Text  
133 OWF Income NU Number 33
134 Investment Income NU Number 13
135 Income social security TF True/False true
136 Income Other Decription TE Text paper route
137 FILESTATUS Multiple Choice  
138 Language MC Multiple Choice  
139 Primary Language MC Multiple Choice 2
140 Income investment TF True/False true
141 Court Papers TF True/False false
142 Court Papers DA Date  
143 Court Papers Case TE Text  
144 Court Papers Court TE Text  
145 Court Papers Hearing Date DA Date  
146 Court Papers Hearing Time TE Multiple Choice  
147 User Ethnicity Other TE Text  
148 Debt Credit Card TF True/False true
149 Debt Forclosed TF True/False true
150 Debt Judgement TF True/False true
151 Debt Utilities TF True/False true
152 Debt Loans TF True/False true
153 Debt Medical TF True/False true
154 Debt Mortgage TF True/False true
155 NOTA130 True/False false
156 Credit Card Payment Amount NU Number 3
157 Credit Card Owed Amount NU Number 30
158 Foreclosure Amount Owed NU Text 40
159 Foreclosure Payment NU Number 4
160 Judgements Amount Owed NU Number 50
161 Judgements Payment Amount NU Number 5
162 Utility Amount Owed NU Number 60
163 Utility Payment Amount NU Number 6
164 Loan Amount Owed NU Number 70
165 Loan Payment Amount NU Number 7
166 Medical Debt Amount Owed NU Text  
167 Medical Amount Owed NU Number 80
168 Mortgage Amount Owed NU Text 90
169 Mortgage Payment Amount NU Text 9
170 Medical Payment Amount NU Number 8
171 Expenses Medical TF True/False true
172 Expenses Child Care TF True/False true
173 Expenses Transportation TF True/False true
174 Expenses Other TF True/False true
175 NOTA139 True/False false
176 Expenses Medical NU Number 50
177 Expenses Child Care NU Number 51
178 Expenses Transportation NU Number 52
179 Expenses Other NU Number 53
180 NOTA39 True/False  
181 OPCount Text 1
182 NOTA113 True/False  
183 NOTA211 True/False true
184 Other_ADULT_NU Number 2
185 Adults_Helped_NU Number 1
186 Income Text  
187 Income TF Multiple Choice 1
188 No Income TF Multiple Choice  
189 Income MC Multiple Choice  
190 A2J_Bookmark Text  
191 Problem Type MC Multiple Choice Food Stamps
192 File status MC Multiple Choice  
193 Problem Type TE Multiple Choice  
194 Client marital status MC Multiple Choice  

Beside the illustrative or tutorial value of this transform, it could also be used by many word processing, spreadsheet and database applications that are able to import variables from HTML tables. The main value, however, is to demonstrate how to loop through the ANX XML and how the data can be transformed into any type of text output, not just more XML.

Here is the complete XSL transform file in a zip file in case you want to download it and modify it. I donate it to the public domain for anyone who wants to make use of it for any purpose whatsoever. If you have any questions or you want assistance with creating an XSL transform for your legal aid or court automation project, you can contact me at the following numbers or email...

John Mayer
Executive Director
Center for Computer-Assisted Legal Instruction / CALI
312-906-5307 (office)
jmayer@cali.org