La première version est toujours visible à l'adresse http://guimberteau.name/ado2xml.inc. Elle produisait une chaîne de caractères par concaténation, ce qui était assez lourd. La nouvelle version dont voici des extraits travaille avec SAX et l'objet MXXMLWriter. Le résultat produit est directement utilisable, c'est un objet DomDocument. De plus, le traitement est bien plus rapide.
SQL="select distinct" & _
" S1.SUBJECT as SUBJECT1," & _
" count(*) as I " & _
"from" & _
" BOOKMARK B," & _
" SUBJECT1 S1 " & _
"where" & _
" PUB=2 and" & _
" B.S1=S1.S1 and" & _
" S1.SUBJECT<>'' " & _
"group by" & _
" S1.SUBJECT " & _
"order by" & _
S1.SUBJECT"
<%
SUB Ado2xml
Set oXMLD = CreateObject("Microsoft.XMLDOM")
Set oXMLW = CreateObject("MSXML2.MXXMLWriter")
oXMLW.encoding = "windows-1252"
oXMLW.indent = True
oXMLW.output = oXMLD
oXMLW.startDocument
oXMLW.startElement "","","Records",Nothing
Call OuvreRS ' Ouverture du RecordSet
' Pour chaque enregistrement, un element Record
While Not oRS.Eof
oXMLW.startElement "","","Record",Nothing
' Pour chaque champ, un element de même nom
For I = 0 to oRS.Fields.Count-1
NAME = Proper(oRS.Fields(I).Name) ' Mise au propre du nom
oXMLW.startElement "","",NAME,Nothing
oXMLW.characters Trim(oRS(NAME))
oXMLW.endElement "","",NAME
Next
oXMLW.endElement "","","Record"
oRS.MoveNext
Wend
Call FermeRS ' Fermeture du RecordSet
oXMLW.endElement "","","Records"
oXMLW.endDocument
Set oXMLW = Nothing
End SUB
' Mise au propre du nom
Function Proper(N)
Proper = UCase(Left(N,1))+LCase(Mid(N,2))
End Function
%>
<?xml version="1.0" encoding="windows-1252" standalone="no"?>
<Records>
<Record>
<Subject1>Annuaires</Subject1>
<I>40</I>
</Record>
<Record>
<Subject1>Certification</Subject1>
<I>63</I>
</Record>
...
<Record>
<Subject1>Windows nt</Subject1>
<I>65</I>
</Record>
<Record>
<Subject1>Windows xp</Subject1>
<I>142</I>
</Record>
</Records>
oXMLD.Save "subject1.xml"
Response.Buffer = False Response.Charset = "windows-1252" Response.ContentType = "text/xml" oXMLD.Save Response Session.Abandon
Set oXMLS = CreateObject("Microsoft.XMLDOM")
oXMLS.Async = False
oXMLS.Load(Server.MapPath("subject1.xsl"))
Response.Write oXMLD.TransformNode(oXMLS)
Response.Flush