1
<?xml version="1.0" encoding="UTF-8"?>
2
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema">
3
<xsl:output method="text"/>
6
This xsl parses a awstats xml "history file" and generates a small
7
plaintext report, nicely suited for cron and mail. some decisions have been
8
made regarding what to display - pages or hits, etc. You are free to tweak.
10
Commissioned by LabforCulture
11
*pike@labforculture.org 20060708
14
mail -s stats yourboss@yoursite < xsltproc thisfile.xsl database.xml
16
build for AWSTATS DATA FILE 6.5 (build 1.857)
21
<xsl:template match="/">
23
<xsl:for-each select="/xml/section[@id='general']/table/tr">
25
<xsl:text>
----------------</xsl:text>
27
<xsl:for-each select="td[text()='FirstTime']">
28
<xsl:text>
Period </xsl:text>
30
<xsl:for-each select="./following-sibling::node()">
31
<xsl:value-of select="concat(': ',substring(.,1,4),'/',substring(.,5,2),'/',substring(.,7,2))" />
33
<xsl:for-each select="../../tr/td[text()='LastTime']/following-sibling::node()">
34
<xsl:value-of select="concat(' - ',substring(.,1,4),'/',substring(.,5,2),'/',substring(.,7,2))" />
38
<xsl:for-each select="td[text()='TotalUnique']/following-sibling::node()">
39
<xsl:text>
Total unique visitors : </xsl:text>
41
<xsl:value-of select="." />
44
<xsl:for-each select="td[text()='TotalVisits']/following-sibling::node()">
45
<xsl:text>
Total visits : </xsl:text>
46
<xsl:value-of select="." />
51
<xsl:for-each select="/xml/section[@id='time']/table">
53
<xsl:text>
Total viewed pages : </xsl:text><xsl:value-of select="sum(tr/td[2])" />
54
<xsl:text>
Total viewed hits : </xsl:text><xsl:value-of select="sum(tr/td[3])" />
55
<xsl:text>
Total not viewed pages : </xsl:text><xsl:value-of select="sum(tr/td[5])" />
56
<xsl:text>
Total not viewed hits : </xsl:text><xsl:value-of select="sum(tr/td[6])" />
60
<xsl:for-each select="/xml/section[@id='misc']/table">
62
<xsl:for-each select="tr/td[text()='AddToFavourites']/following-sibling::node()[2]">
63
<xsl:text>
Added to favourites (?) : </xsl:text>
64
<xsl:value-of select="." />
68
<xsl:text>
----------------</xsl:text>
71
<xsl:for-each select="/xml/section[@id='session']/table">
72
<xsl:text>
Visit duration:</xsl:text>
74
<xsl:for-each select="tr/td[text()='0s-30s']/following-sibling::node()">
75
<xsl:text>
 0s-30s : </xsl:text>
76
<xsl:value-of select="." />
78
<xsl:for-each select="tr/td[text()='30s-2mn']/following-sibling::node()">
79
<xsl:text>
 30s-2mn : </xsl:text>
80
<xsl:value-of select="." />
83
<xsl:for-each select="tr/td[text()='2mn-5mn']/following-sibling::node()">
84
<xsl:text>
 2mn-5mn : </xsl:text>
85
<xsl:value-of select="." />
87
<xsl:for-each select="tr/td[text()='5mn-15mn']/following-sibling::node()">
88
<xsl:text>
 5mn-15mn : </xsl:text>
90
<xsl:value-of select="." />
92
<xsl:for-each select="tr/td[text()='15mn-30mn']/following-sibling::node()">
93
<xsl:text>
 15mn-30mn : </xsl:text>
94
<xsl:value-of select="." />
96
<xsl:for-each select="tr/td[text()='30mn-1h']/following-sibling::node()">
97
<xsl:text>
 30mn-1h : </xsl:text>
99
<xsl:value-of select="." />
101
<xsl:for-each select="tr/td[text()='1h+']/following-sibling::node()">
102
<xsl:text>
 1h+ : </xsl:text>
103
<xsl:value-of select="." />
108
<xsl:text>
----------------</xsl:text>
111
<xsl:for-each select="/xml/section[@id='domain']/table">
113
<xsl:text>
Countries top 5:</xsl:text>
114
<xsl:for-each select="tr">
115
<xsl:sort select="td[2]" data-type="number" order="descending"/>
116
<xsl:if test="position()<=5">
117
<xsl:text>
 </xsl:text>
118
<xsl:value-of select="td[1]" />
119
<xsl:text> : </xsl:text>
121
<xsl:value-of select="td[2]" />
122
<xsl:text> pages</xsl:text>
128
<xsl:text>
----------------</xsl:text>
130
awstats xml output is seriously bugged here in my version.
131
the first 10 rows of sider has 5 columns, the rest has 4 columns ..
132
the second columns content is added as plaintext inside the first column !
134
i will wait for a fix. meanwhile, the numbers outputted
139
<xsl:for-each select="/xml/section[@id='sider']/table">
142
<xsl:text>
Entry pages top 10 (bugged):</xsl:text>
143
<xsl:for-each select="tr">
144
<xsl:sort select="td[4]" data-type="number" order="descending"/>
145
<xsl:if test="position()<=10">
146
<xsl:text>
 </xsl:text>
147
<xsl:value-of select="td[4]" />
148
<xsl:text> : </xsl:text>
149
<xsl:value-of select="td[1]" />
153
<xsl:text>
Exit pages top 10 (bugged):</xsl:text>
154
<xsl:for-each select="tr[position()<=10]">
155
<xsl:sort select="td[5]" data-type="number" order="descending"/>
156
<xsl:if test="position()<=10">
157
<xsl:text>
 </xsl:text>
158
<xsl:value-of select="td[5]" />
159
<xsl:text> : </xsl:text>
160
<xsl:value-of select="td[1]" />
169
<xsl:for-each select="/xml/section[@id='origin']/table">
170
<xsl:text>
Users arrived via:</xsl:text>
171
<xsl:for-each select="tr">
172
<xsl:sort select="td[2]" data-type="number" order="descending"/>
173
<xsl:if test="td[1]='From0'">
174
<xsl:text>
 Typed in / from bookmarks : </xsl:text>
175
<xsl:value-of select="td[2]" /><xsl:text> pages</xsl:text>
178
<xsl:if test="td[1]='From1'">
179
<xsl:text>
 Unknown : </xsl:text>
180
<xsl:value-of select="td[2]" /><xsl:text> pages</xsl:text>
182
<xsl:if test="td[1]='From2'">
183
<xsl:text>
 Linked from an Internet Search Engine : </xsl:text>
185
<xsl:value-of select="td[2]" /><xsl:text> pages</xsl:text>
187
<xsl:if test="td[1]='From3'">
188
<xsl:text>
 Linked from an external page : </xsl:text>
189
<xsl:value-of select="td[2]" /><xsl:text> pages</xsl:text>
192
<xsl:if test="td[1]='From4'">
193
<xsl:text>
 Linked from an internal page : </xsl:text>
194
<xsl:value-of select="td[2]" /><xsl:text> pages</xsl:text>
196
<xsl:if test="td[1]='From5'">
197
<xsl:text>
 Linked from newsgroups : </xsl:text>
199
<xsl:value-of select="td[2]" /><xsl:text> pages</xsl:text>
204
<xsl:text>
----------------</xsl:text>
206
<xsl:for-each select="/xml/section[@id='searchwords']/table">
207
<xsl:text>
Top search phrases:</xsl:text>
208
<xsl:for-each select="tr[position()<=10]">
210
<xsl:text>
 </xsl:text>
211
<xsl:value-of select="td[1]" />
212
<xsl:text> - </xsl:text>
213
<xsl:value-of select="td[2]" />
214
<xsl:text> hits</xsl:text>
220
<xsl:text>
----------------</xsl:text>
222
<xsl:for-each select="/xml/section[@id='sereferrals']/table">
223
<xsl:text>
Robots/spiders:</xsl:text>
224
<xsl:for-each select="tr">
225
<xsl:sort select="td[3]" data-type="number" order="descending"/>
226
<xsl:if test="position()<=10">
227
<xsl:text>
 </xsl:text>
229
<xsl:value-of select="td[1]" />
230
<xsl:text> - </xsl:text>
231
<xsl:value-of select="td[3]" />
232
<xsl:text> hits</xsl:text>
239
<xsl:text>
----------------
</xsl:text>