'Kleines Script zum Erzeugen von Html-Output aus XML-Dokumenten 'Jürgen Auer, 04/08 2003 'Das Script lädt das im aktuellen Ordner befindliche www.sql-und-xml.de.xsl, 'setzt den Parameterwert (Standard: .xml) auf .html, auf daß nicht die 'Verweise von Html-Seiten plötzlich auf XMl-Dokumente zielen, 'lädt jedes Xml-Dokument im aktuellen Ordner, matcht es mit dem XSL und 'speichert es unter ..\ mit geänderter Endung ab. 'Derzeit werden die Outputs als ANSI gespeichert, damit auch sehr alte Browser, 'die noch kein Unicode können, damit klarkommen. 'Hinweis: Dieses Script ist derzeit sehr experimentell 'Starten Sie es mit WScript, so erhalten Sie ständig MessageBoxen 'Deshalb: CScript transform-xml-to-html-output.vbs 'Dann werden gewisse Meldungen in der Konsole ausgegeben 'Wenn Sie das Script für eigene Zwecke verwenden möchten, ist folgendes zu beachten: '1. Wenn Sie anstelle der MSXML4 die MSXML3 installiert haben, ändern Sie (1) ab ' aus DOMDocument.4.0 wird DOMDocument.3.0 ' '2. Löschen Sie die Zeile (2) bzw. kommentieren Sie diese aus. Diese Zeile ist speziell für ' meine XSL-Datei, ich benötige sie, um bei Links die Dateiendungen auf Xml bzw. ' Html zu setzen ' '3. Setzen Sie in (3) Ihre eigene Xsl-Datei ein, das Script kommt in denselben Unterordner, ' dieser darf nicht / sein. ' 'Das Script lädt einmalig die Xsl-Datei, sucht in seinem eigenen Ordner und allen tieferliegenden ' Ordnern nach Xml-Dateien, lädt diese, matcht sie mit dem Xsl-Dokument und speichert den ' Html-Output unter ../ bzw. in analog dort erstellten Unterordnerstrukturen ab. ' Gibt es bereits Dateien mit demselben Namen, werden diese ohne Nachfragen überschrieben Function open_xmlDoc(xDoc, relative_Path, base_path) '(1) Set xDoc = WScript.CreateObject("MsXML2.DOMDocument.4.0") xDoc.async = False 'xDoc.validateOnParse = True xDoc.load base_path & relative_Path End Function Function transform_folder(fso, xslDoc, source_path, base_path, this_folder, cur_subFolder, create_print) Dim f_list, folder_list, f, fo, xmlDoc, new_fileName, new_FileStream, str_transformResult, cur_resultFolder, bol_write_Unicode Set f_list = this_folder.Files 'Falls die Datei xml-lernen.xml bearbeitet wird, wird diese als Unicode gespeichert - alten Browsern zum Trotz 'Denn gerade die Unicode-Elemente sind das, was über Html hinausgeht cur_resultFolder = base_path & cur_subFolder cur_resultFolder = Left(cur_resultFolder, Len(cur_resultFolder) - 1) 'WScript.Echo "cur_ResultFolder: " & cur_resultFolder If Not fso.FolderExists(cur_resultFolder) Then fso.CreateFolder(cur_resultFolder) End If For Each f In f_list bol_create_document = False new_fileName = "" If Right(f.Name, 4) = ".xml" Then open_xmlDoc xmlDoc, f.Name, source_path 'MsgBox xmlDoc.TransformNode(xslDoc) If create_print Then If (Len(cur_subFolder) > 0) And (f.name = "index.xml") Then new_fileName = fso.GetAbsolutePathName(base_path & cur_subFolder & Left(cur_subFolder, Len(cur_subFolder) - 1) & "-print.html") End If Else new_fileName = fso.GetAbsolutePathName(base_path & cur_subFolder & Left(f.Name, Len(f.Name) - 3) & "html") End If 'WScript.Echo "source_Path: " & source_Path 'WScript.Echo "Aktuell : " & f.name 'WScript.Echo "Neu : " & new_fileName 'WScript.Echo new_FileName On Error Resume Next If Len(new_FileName) > 0 Then If fso.FileExists(new_FileName) Then fso.DeleteFile new_FileName, True If Err.Number <> 0 Then WScript.Echo "Datei " & new_FileName & " konnte nicht gelöscht werden" Else bol_create_document = True End If End If On Error Goto 0 bol_write_Unicode = 0 'WScript.Echo cur_resultFolder If (InStr(1, cur_resultFolder, "\xml-lernen") > 0) Then 'bol_write_Unicode = -1 End If 'bol_write_Unicode = True 'WScript.Echo bol_write_Unicode If Not (xmlDoc.SelectSingleNode("//@create-html") Is Nothing) Then If xmlDoc.SelectSingleNode("//@create-html").Value = "no" Then bol_create_document = False End If End If If bol_create_document Then Set new_FileStream = fso.CreateTextFile(new_FileName, True, bol_write_Unicode) str_transformResult = xmlDoc.TransformNode(xslDoc) WScript.Echo new_FileName If Len(xmlDoc.parseError.srcText) > 0 Then WScript.Echo xmlDoc.parseError.srcText WScript.Echo xmlDoc.parseError.reason End If 'WScript.Echo "Resultat von " & new_FileName & ": " & str_transformResult 'Die folgende Zeile entfernt den lästigen, von der Transformation eingefügten 'Meta-Ausdruck, der mit dem selbstdefinierten Content-Type kollidiert str_transformResult = Replace(str_transformResult, _ "", "") str_transformResult = Replace(str_transformResult, _ "", _ "") On Error Resume Next new_FileStream.Write str_transformResult If err.Number <> 0 Then WScript.Echo str_transformResult WScript.Echo err.Description End If On Error Goto 0 new_FileStream.Close End If End If Next For Each fo In this_folder.SubFolders 'WScript.Echo "Subfolder: " & fo.Name transform_folder fso, xslDoc, source_path & fo.Name & "\", base_path & cur_subFolder, fo, fo.Name & "\", create_print Next End Function Dim xslDoc, fso, script_Path, base_path, i, this_folder, f, new_fileName, new_FileStream, str_transformResult, bol_write_Unicode, bol_create_document, bol_create_print, css_file script_Path = Replace(WScript.ScriptFullname, WScript.ScriptName, "") bol_create_print = False Set fso = WScript.CreateObject("Scripting.FileSystemObject") '(3) open_xmlDoc xslDoc, "www.sql-und-xml.de.xsl", script_Path '(2) Verknüpfungsendungen auf html ändern, falls nicht 'print' - Output produziert wird if WScript.Arguments.Length > 0 Then If WScript.Arguments(0) = "print" Then xslDoc.SelectSingleNode("//*[@name = 'output-filetype']").Text = "print" bol_create_print = True xslDoc.SelectSingleNode("//*[@name = 'css-file']").Text = fso.OpenTextFile("../sql-datenbank-mieten.css").ReadAll() Else xslDoc.SelectSingleNode("//*[@name = 'output-filetype']").Text = "html" End If Else xslDoc.SelectSingleNode("//*[@name = 'output-filetype']").Text = "html" End If Set this_folder = fso.GetFolder(Left(script_Path, Len(script_Path) - 1)) base_path = fso.GetAbsolutePathName(script_Path & "..\") transform_folder fso, xslDoc, script_path, base_path, this_folder, "\", bol_create_print