Reputation: 45
Following xml file data: (try to keep the whole explanations/description as brief as possible)
<upkeepList>
<upkShare month_year="03/17" post_dte="16/04/17" due="02/05/17">
<OpngBlnce></OpngBlnce>
<mnthCrrntAmnt>55</mnthCrrntAmnt>
<Rcpt dte="10/05/17" No="5815">
<amnt>40</amnt>
<descrpt>"03/17-04/17" upkeep 1</descrpt>
</Rcpt>
<Rcpt dte="15/05/17" No="5825">
<amnt>9</amnt>
<descrpt>"03/17-04/17" upkeep 2</descrpt>
</Rcpt>
</upkShare>
<upkShare month_year="01/17-02/17" post_dte="17/03/17" due="03/04/17">
<OpngBlnce></OpngBlnce> <!-- starting from this sect. this tag can be omitted as it'a calculated field -->
<mnthCrrntAmnt>74</mnthCrrntAmnt>
<Rcpt dte="30/03/17" No="5783">
<amnt>50</amnt>
<descrpt>"01/17-02/17" upkeep</descrpt>
</Rcpt>
</upkShare>
<upkShare month_year="11/16-12/16" post_dte="20/01/17" due="04/02/17">
<OpngBlnce>22</OpngBlnce>
<mnthCrrntAmnt>77</mnthCrrntAmnt>
<Rcpt dte="26/01/17" No="5725">
<amnt>22</amnt>
<descrpt>"11/16" upkeep </descrpt>
</Rcpt>
<Rcpt dte="26/01/17" No="5726">
<amnt>41</amnt>
<descrpt>"12/16" upkeep </descrpt>
</Rcpt>
</upkShare>
<upkShare month_year="07/17" post_dte="16/08/17" due="31/08/17">
<OpngBlnce></OpngBlnce>
<mnthCrrntAmnt>54</mnthCrrntAmnt>
<Rcpt dte="28/07/17" No="6002">
<amnt>33</amnt>
<descrpt>"07/17" upkeep 1</descrpt>
</Rcpt>
<Rcpt dte="02/08/17" No="6017">
<amnt>12</amnt>
<descrpt>"07/17" upkeep 2</descrpt>
</Rcpt>
</upkShare>
<upkShare month_year="04/17-05/17" post_dte="05/06/17" due="30/06/17">
<OpngBlnce></OpngBlnce>
<mnthCrrntAmnt>64</mnthCrrntAmnt>
<Rcpt dte="14/06/17" No="5858">
<amnt>37</amnt>
<descrpt>"05/17" upkeep 1</descrpt>
</Rcpt>
<Rcpt dte="18/06/17" No="5863">
<amnt>21</amnt>
<descrpt>"05/17" upkeep 2</descrpt>
</Rcpt>
</upkShare>
<upkShare month_year="06/17" post_dte="16/07/17" due="30/07/17">
<OpngBlnce></OpngBlnce>
<mnthCrrntAmnt>45</mnthCrrntAmnt>
<Rcpt dte="28/07/17" No="5948">
<amnt>38</amnt>
<descrpt>"06/17" upkeep</descrpt>
</Rcpt>
</upkShare>
</upkeepList>
and throgh some xslt transform like this (wrongly) one
<xsl:template match="upkeepList">
<xsl:variable name="ukshrtbl"> <!-- ukshrtbl = upkp shrs table-->
<tr><th>MntncPrd</th><th>PostDte</th><th>OpngBlnc</th><th>MnthlyCrrntAmnt</th><th>PymntTotlAmnt</th><th>Amount Payed</th><th>RmngPmnt</th><th>Due</th></tr>
<xsl:call-template name="Prcss"> <!-- Prcss = Prcssing -->
<xsl:with-param name="srtdDte" as="element()*" select="upkShare => sort((),function($shr) { replace($shr/@month_year,'([0-9]{2})/([0-9]{2})','$3$2$1')})"/>
</xsl:call-template>
</xsl:variable>
<xsl:variable name="swpd-tble" select="mf:trsp-tbl($ukshrtbl/tr)"/> <!-- swap-table /swpd-tble -->
<table id="dtaTbl" border="1" style="border-collapse:collapse">
<tr><th>CrrtNbr</th>
<xsl:for-each select="1 to count($swpd-tble[1]/*) - 1">
<xsl:if test="position() mod 2 = 0"> <!-- smthng .. -->
<td rowspan="5" colspan="2" ></td> <!-- rowspan="5" -->
</xsl:if>
<td>{position()}</td>
</xsl:for-each>
</tr>
<xsl:copy-of select="$swpd-tble"/> <!-- <xsl:sequence select="$swpd-tble"/> -->
</table>
</xsl:template>
<!-- funct for swapping lines with cols -->
<xsl:function name="mf:trsp-tbl" as="element(tr)*"> <xsl:param name="rows" as="element(tr)*"/>
<xsl:for-each select="1 to count($rows[1]!*)">
<xsl:variable name="col" select="."/>
<tr><th>{$rows[1]/*[current()]}</th> <!-- here smwhere - thnk - colspan/rowspan logic should be placed -->
<xsl:for-each select="2 to count($rows/*[1])">
<td>{$rows[current()]!*[$col]}</td>
</xsl:for-each>
</tr>
</xsl:for-each>
</xsl:function>
<xsl:template name="Prcss"><xsl:param name="srtdDte"/> <xsl:param name="sdts" select="$srtdDte[1]"/> <!-- $sdts - evrthng should be prfxd with it -->
<xsl:param name="ob" select="if($sdts/OpngBlnce/text()) then number($sdts/OpngBlnce) else 0"/> <!-- OB -> $ob "$sdts/soldInit" -->
<xsl:variable name="mcamnt" select="if($sdts/mnthCrrntAmnt/text()) then number($sdts/mnthCrrntAmnt) else 0"/>
<xsl:variable name="ptamnt" select="$ob + $mcamnt"/> <!-- ptamnt = payment total amount -->
<xsl:variable name="apyd" select="$sdts/sum(Rcpt/number(concat('0',amnt)))"/> <!-- apyd = amount payed (rcpts amnt sum) -->
<xsl:variable name="cb" select="$ptamnt - $apyd"/> <!-- cb = closing balance -->
<tr><td><xsl:value-of select="$sdts/@month_year"/></td>
<td><xsl:value-of select="$sdts/@post_dte"/></td>
<td><xsl:value-of select="$ob"/></td>
<td><xsl:value-of select="$sdts/mnthCrrntAmnt"/></td>
<td><xsl:value-of select="$ptamnt"/></td> <!-- gss from here one should do the rcpts display ...-->
<td><xsl:value-of select="$apyd"/> [-]</td>
<td><xsl:value-of select="$cb"/></td> <!-- $cb -->
<td><xsl:value-of select="$sdts/@due"/></td> <!-- due date - till here .. (on rcpt displaying) -->
</tr>
<xsl:for-each select="$sdts//Rcpt">
<tr> <td/> <th>Rcpt No</th><th>Rcpt Dte</th><th>Rcpt Amnt</th><th>Dscrpt</th></tr>
<tr><td><xsl:value-of select="@No"/></td><td><xsl:value-of select="@dte"/></td>
<td><xsl:value-of select="amnt"/></td> <td><xsl:value-of select="descrpt"/></td></tr>
</xsl:for-each>
<xsl:if test="count($srtdDte) > 1">
<xsl:call-template name="Prcss"> <xsl:with-param name="srtdDte" select="$srtdDte[position() > 1]"/>
<xsl:with-param name="ob" select="$cb"/>
</xsl:call-template>
</xsl:if>
</xsl:template>
one need to SORTED transposed display that xml data (through xslt2/xslt3 processor) as html table like in this picture:
As also mentioned through some other quite similar posts, there are a couple things on taking into account:
Upvotes: 0
Views: 114
Reputation: 551
If understood well, this stylesheet does the job.
I get this output (screenshot)
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
exclude-result-prefixes="xs"
version="2.0">
<!-- Template to format date -->
<xsl:template name="format-date">
<xsl:param name="d"/>
<xsl:variable name="year" select="substring($d, 7, 2)"/>
<xsl:variable name="month" select="substring($d, 4, 2)"/>
<xsl:variable name="day" select="substring($d, 1, 2)"/>
<xsl:variable name="century" select="if (xs:integer($year) > 50) then '19' else '20'"/>
<xsl:value-of select="concat($day, '/', $month, '/', $century, $year)"/>
</xsl:template>
<!-- Template match for the main document -->
<xsl:template match="/">
<html>
<head>
<style>
table {
border-collapse: collapse;
width: 100%;
}
th, td {
border: 1px solid black;
padding: 8px;
text-align: center;
}
</style>
</head>
<body>
<table border="1">
<tr>
<th>CrrntNmbr</th>
<xsl:for-each select="/upkeepList/upkShare">
<xsl:sort select="@month_year" data-type="text" order="ascending" />
<td><xsl:value-of select="position()"/></td>
<td/><xsl:for-each select="Rcpt"><td/></xsl:for-each>
</xsl:for-each>
</tr>
<tr>
<th>MntncPrd</th>
<xsl:for-each select="/upkeepList/upkShare">
<xsl:sort select="@month_year" data-type="text" order="ascending" />
<td><xsl:value-of select="@month_year"/></td>
<td/><xsl:for-each select="Rcpt"><td/></xsl:for-each>
</xsl:for-each>
</tr>
<tr>
<th>PostDate</th>
<xsl:for-each select="/upkeepList/upkShare">
<xsl:sort select="@month_year" data-type="text" order="ascending" />
<td><xsl:call-template name="format-date">
<xsl:with-param name="d" select="@post_dte"/>
</xsl:call-template>
</td>
<td/><xsl:for-each select="Rcpt"><td/></xsl:for-each>
</xsl:for-each>
</tr>
<tr>
<th>OpngBlnce</th>
<xsl:for-each select="/upkeepList/upkShare">
<xsl:sort select="@month_year" data-type="text" order="ascending" />
<td><xsl:value-of select="position()" /></td>
<td/><xsl:for-each select="Rcpt"><td/></xsl:for-each>
</xsl:for-each>
</tr>
<tr>
<th>MnthlyCrrntAmnt</th>
<xsl:for-each select="/upkeepList/upkShare">
<xsl:sort select="@month_year" data-type="text" order="ascending" />
<td><xsl:value-of select="mnthCrrntAmnt"/></td>
<td/><xsl:for-each select="Rcpt"><td/></xsl:for-each>
</xsl:for-each>
</tr>
<tr>
<th>PymntTotlAmnt</th>
<xsl:for-each select="/upkeepList/upkShare">
<xsl:sort select="@month_year" data-type="text" order="ascending" />
<td><xsl:value-of select="sum(Rcpt/amnt)"/></td>
<td>RcptNr</td>
<xsl:for-each select="Rcpt">
<td><xsl:value-of select="@No"/></td>
</xsl:for-each>
</xsl:for-each>
</tr>
<tr>
<th>Amount Payed</th>
<xsl:for-each select="/upkeepList/upkShare">
<xsl:sort select="@month_year" data-type="text" order="ascending" />
<td><xsl:value-of select="sum(Rcpt/amnt)"/>[-]</td>
<td>RcptDte</td>
<xsl:for-each select="Rcpt">
<td><xsl:call-template name="format-date">
<xsl:with-param name="d" select="@dte"/>
</xsl:call-template>
</td>
</xsl:for-each>
</xsl:for-each>
</tr>
<tr>
<th>RmngPmnt</th>
<xsl:for-each select="/upkeepList/upkShare">
<xsl:sort select="@month_year" data-type="text" order="ascending" />
<td><xsl:value-of select="position()" /></td>
<td>RcptAmnt</td>
<xsl:for-each select="Rcpt">
<td><xsl:value-of select="amnt"/></td>
</xsl:for-each>
</xsl:for-each>
</tr>
<tr>
<th>Due</th>
<xsl:for-each select="/upkeepList/upkShare">
<xsl:sort select="@month_year" data-type="text" order="ascending" />
<td><xsl:call-template name="format-date">
<xsl:with-param name="d" select="@due"/>
</xsl:call-template>
</td>
<td>Dscrpt</td>
<xsl:for-each select="Rcpt">
<td><xsl:value-of select="descrpt"/></td>
</xsl:for-each>
</xsl:for-each>
</tr>
</table>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
Html Output:
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><style>
table {
border-collapse: collapse;
width: 100%;
}
th, td {
border: 1px solid black;
padding: 8px;
text-align: center;
}
</style></head>
<body>
<table border="1">
<tr>
<th>CrrntNmbr</th>
<td>1</td>
<td></td>
<td></td>
<td>2</td>
<td></td>
<td></td>
<td></td>
<td>3</td>
<td></td>
<td></td>
<td></td>
<td>4</td>
<td></td>
<td></td>
<td>5</td>
<td></td>
<td></td>
<td></td>
<td>6</td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<th>MntncPrd</th>
<td>01/17-02/17</td>
<td></td>
<td></td>
<td>03/17</td>
<td></td>
<td></td>
<td></td>
<td>04/17-05/17</td>
<td></td>
<td></td>
<td></td>
<td>06/17</td>
<td></td>
<td></td>
<td>07/17</td>
<td></td>
<td></td>
<td></td>
<td>11/16-12/16</td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<th>PostDate</th>
<td>17/03/2017</td>
<td></td>
<td></td>
<td>16/04/2017</td>
<td></td>
<td></td>
<td></td>
<td>05/06/2017</td>
<td></td>
<td></td>
<td></td>
<td>16/07/2017</td>
<td></td>
<td></td>
<td>16/08/2017</td>
<td></td>
<td></td>
<td></td>
<td>20/01/2017</td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<th>OpngBlnce</th>
<td>1</td>
<td></td>
<td></td>
<td>2</td>
<td></td>
<td></td>
<td></td>
<td>3</td>
<td></td>
<td></td>
<td></td>
<td>4</td>
<td></td>
<td></td>
<td>5</td>
<td></td>
<td></td>
<td></td>
<td>6</td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<th>MnthlyCrrntAmnt</th>
<td>74</td>
<td></td>
<td></td>
<td>55</td>
<td></td>
<td></td>
<td></td>
<td>64</td>
<td></td>
<td></td>
<td></td>
<td>45</td>
<td></td>
<td></td>
<td>54</td>
<td></td>
<td></td>
<td></td>
<td>77</td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<th>PymntTotlAmnt</th>
<td>50</td>
<td>RcptNr</td>
<td>5783</td>
<td>49</td>
<td>RcptNr</td>
<td>5815</td>
<td>5825</td>
<td>58</td>
<td>RcptNr</td>
<td>5858</td>
<td>5863</td>
<td>38</td>
<td>RcptNr</td>
<td>5948</td>
<td>45</td>
<td>RcptNr</td>
<td>6002</td>
<td>6017</td>
<td>63</td>
<td>RcptNr</td>
<td>5725</td>
<td>5726</td>
</tr>
<tr>
<th>Amount Payed</th>
<td>50[-]</td>
<td>RcptDte</td>
<td>30/03/2017</td>
<td>49[-]</td>
<td>RcptDte</td>
<td>10/05/2017</td>
<td>15/05/2017</td>
<td>58[-]</td>
<td>RcptDte</td>
<td>14/06/2017</td>
<td>18/06/2017</td>
<td>38[-]</td>
<td>RcptDte</td>
<td>28/07/2017</td>
<td>45[-]</td>
<td>RcptDte</td>
<td>28/07/2017</td>
<td>02/08/2017</td>
<td>63[-]</td>
<td>RcptDte</td>
<td>26/01/2017</td>
<td>26/01/2017</td>
</tr>
<tr>
<th>RmngPmnt</th>
<td>1</td>
<td>RcptAmnt</td>
<td>50</td>
<td>2</td>
<td>RcptAmnt</td>
<td>40</td>
<td>9</td>
<td>3</td>
<td>RcptAmnt</td>
<td>37</td>
<td>21</td>
<td>4</td>
<td>RcptAmnt</td>
<td>38</td>
<td>5</td>
<td>RcptAmnt</td>
<td>33</td>
<td>12</td>
<td>6</td>
<td>RcptAmnt</td>
<td>22</td>
<td>41</td>
</tr>
<tr>
<th>Due</th>
<td>03/04/2017</td>
<td>Dscrpt</td>
<td>"01/17-02/17" upkeep</td>
<td>02/05/2017</td>
<td>Dscrpt</td>
<td>"03/17-04/17" upkeep 1</td>
<td>"03/17-04/17" upkeep 2</td>
<td>30/06/2017</td>
<td>Dscrpt</td>
<td>"05/17" upkeep 1</td>
<td>"05/17" upkeep 2</td>
<td>30/07/2017</td>
<td>Dscrpt</td>
<td>"06/17" upkeep</td>
<td>31/08/2017</td>
<td>Dscrpt</td>
<td>"07/17" upkeep 1</td>
<td>"07/17" upkeep 2</td>
<td>04/02/2017</td>
<td>Dscrpt</td>
<td>"11/16" upkeep </td>
<td>"12/16" upkeep </td>
</tr>
</table>
</body>
</html>
Test: http://xsltransform.net/jyfDTGR/1
Upvotes: 0
Reputation: 34431
I used Powershell to create the HTML. I changed columns to make more readable.
using assembly System.Xml.Linq
$input_filename = 'c:\temp\test.xml'
$output_filename = 'c:\temp\test.html'
$doc = [System.Xml.Linq.XDocument]::Load($input_filename)
$upkShares = $doc.Descendants('upkShare')
$table = [System.Collections.ArrayList]::new()
foreach($upkShare in $upkShares)
{
$month_year = $upkShare.Attribute('month_year').Value
$startMonth = [DateTime]::ParseExact($month_year.Split('-')[0], 'MM/yy', $null)
$post_dte = $upkShare.Attribute('post_dte').Value
$due = $upkShare.Attribute('due').Value
$OpngBlnce = [decimal]$upkShare.Element('OpngBlnce').Value
if($OpngBlnce -ne '') { $balance = $OpngBlnce }
$mnthCrrntAmnt = [decimal]$upkShare.Element('mnthCrrntAmnt').value
# $pymntTotalAmnt = $OpngBlnce + $mnthCrrntAmnt
$amountPayed = 0
$newRow = [pscustomobject]@{
'Start Month' = $startMonth
'Month/Year' = ''
'Post Date' = ''
OpngBlnce = ''
MnthlyCrrntAmount = ''
PymntTotalAmnt = ''
'Amount Payed' = ''
RmngPmnt = ''
Due = ''
}
$newPayment = $true
foreach($rcpt in $upkShare.Elements('Rcpt'))
{
$newRowClone = $newRow | Select-Object -Property *;
if($newPayment -eq $true)
{
$newRowClone.'Month/Year' = $month_year
$newRowClone.'Start Month' = $startMonth
$newRowClone.'Post Date' = $post_dte
$newRowClone.MnthlyCrrntAmount = $mnthCrrntAmnt
$newRowClone.Due = $due
}
$dte = $rcpt.Attribute('dte').Value
$No = $rcpt.Attribute('No').Value
$amnt = [decimal]$rcpt.Element('amnt').Value
$descrpt = $rcpt.Element('descrpt').Value
$amountPayed += $amnt
$newRowClone | Add-Member -NotePropertyName RecptNr -NotePropertyValue $No;
$newRowClone | Add-Member -NotePropertyName RecptDte -NotePropertyValue $dte;
$newRowClone | Add-Member -NotePropertyName RecptAmnt -NotePropertyValue $amnt;
$newRowClone | Add-Member -NotePropertyName Descrpt -NotePropertyValue $descrpt;
$table.Add($newRowClone) | out-null
$newPayment = $false
}
$newRowClone.'Amount Payed' = $amountPayed
}
# Sort table by start Date
$table = $table | sort-Object -Property 'Start Month'
#Add Current Number to each row
$number = 0
foreach($row in $table)
{
$recptAmnt = $row.RecptAmnt
if($number -eq 1) {$OpngBlnce = $balance}
if($row.MnthlyCrrntAmount -ne '')
{
$number += 1
$row | Add-Member -NotePropertyName CurrntNumber -NotePropertyValue $number;
$row.OpngBlnce = $OpngBlnce
$pymntTotalAmnt = $OpngBlnce + $row.MnthlyCrrntAmount
$row.PymntTotalAmnt = $pymntTotalAmnt
}
if($row.'Amount Payed' -ne '')
{
$rmngPmnt = $pymntTotalAmnt - $row.'Amount Payed'
$row.RmngPmnt = $rmngPmnt
$OpngBlnce = $rmngPmnt
}
}
$table | ConvertTo-Html | Out-File $output_filename
Here is results
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>HTML TABLE</title>
</head><body>
<table>
<colgroup><col/><col/><col/><col/><col/><col/><col/><col/><col/><col/><col/><col/><col/><col/></colgroup>
<tr><th>Start Month</th><th>Month/Year</th><th>Post Date</th><th>OpngBlnce</th><th>MnthlyCrrntAmount</th><th>PymntTotalAmnt</th><th>Amount Payed</th><th>RmngPmnt</th><th>Due</th><th>RecptNr</th><th>RecptDte</th><th>RecptAmnt</th><th>Descrpt</th><th>CurrntNumber</th></tr>
<tr><td>11/1/2016 12:00:00 AM</td><td>11/16-12/16</td><td>20/01/17</td><td>0</td><td>77</td><td>77</td><td></td><td></td><td>04/02/17</td><td>5725</td><td>26/01/17</td><td>22</td><td>"11/16" upkeep </td><td>1</td></tr>
<tr><td>11/1/2016 12:00:00 AM</td><td></td><td></td><td></td><td></td><td></td><td>63</td><td>14</td><td></td><td>5726</td><td>26/01/17</td><td>41</td><td>"12/16" upkeep </td><td></td></tr>
<tr><td>1/1/2017 12:00:00 AM</td><td>01/17-02/17</td><td>17/03/17</td><td>22</td><td>74</td><td>96</td><td>50</td><td>46</td><td>03/04/17</td><td>5783</td><td>30/03/17</td><td>50</td><td>"01/17-02/17" upkeep</td><td>2</td></tr>
<tr><td>3/1/2017 12:00:00 AM</td><td>03/17</td><td>16/04/17</td><td>46</td><td>55</td><td>101</td><td></td><td></td><td>02/05/17</td><td>5815</td><td>10/05/17</td><td>40</td><td>"03/17-04/17" upkeep 1</td><td>3</td></tr>
<tr><td>3/1/2017 12:00:00 AM</td><td></td><td></td><td></td><td></td><td></td><td>49</td><td>52</td><td></td><td>5825</td><td>15/05/17</td><td>9</td><td>"03/17-04/17" upkeep 2</td><td></td></tr>
<tr><td>4/1/2017 12:00:00 AM</td><td>04/17-05/17</td><td>05/06/17</td><td>52</td><td>64</td><td>116</td><td></td><td></td><td>30/06/17</td><td>5858</td><td>14/06/17</td><td>37</td><td>"05/17" upkeep 1</td><td>4</td></tr>
<tr><td>4/1/2017 12:00:00 AM</td><td></td><td></td><td></td><td></td><td></td><td>58</td><td>58</td><td></td><td>5863</td><td>18/06/17</td><td>21</td><td>"05/17" upkeep 2</td><td></td></tr>
<tr><td>6/1/2017 12:00:00 AM</td><td>06/17</td><td>16/07/17</td><td>58</td><td>45</td><td>103</td><td>38</td><td>65</td><td>30/07/17</td><td>5948</td><td>28/07/17</td><td>38</td><td>"06/17" upkeep</td><td>5</td></tr>
<tr><td>7/1/2017 12:00:00 AM</td><td></td><td></td><td></td><td></td><td></td><td>45</td><td>58</td><td></td><td>6017</td><td>02/08/17</td><td>12</td><td>"07/17" upkeep 2</td><td></td></tr>
<tr><td>7/1/2017 12:00:00 AM</td><td>07/17</td><td>16/08/17</td><td>58</td><td>54</td><td>112</td><td></td><td></td><td>31/08/17</td><td>6002</td><td>28/07/17</td><td>33</td><td>"07/17" upkeep 1</td><td>6</td></tr>
</table>
</body></html>
Upvotes: 0