2009-06-26 17 views
2

Ich versuche, ein Skript automatisch eine XML-Datei in mehrere HTML-Dateien mit verschiedenen XSLT-Formatvorlagen zu transformieren. Wie auch immer ich es versuche, ich bekomme Fehler. Ich habe es sowohl in VBScript als auch in JScript ausprobiert, und beide geben mir Fehler. Die XML-Datei ist 537 KB und die XSL-Datei ist 5 KB.JScript/VBScript-Fehler

Hier ist Iteration 1 in JScript. Dieses Skript funktioniert für eines meiner Stylesheets (ein Stylesheet, das eine kleinere HTML-Datei erstellt), aber auf einem Stylesheet, das eine größere HTML-Datei erstellt, gibt es mir einen "ungültigen Prozeduraufruf oder -argument" auf outstr ‚t Rückkehr richtig) Fehler:

var xsl = new ActiveXObject("MSXML2.DomDocument.6.0"); 
xsl.async = false; 
var boolval = xsl.load("../Commands/commands.xsl"); 
if(!boolval) 
{ 
    WScript.Echo("XSL load error"); 
    WScript.Quit(); 
} 
var xml = new ActiveXObject("MSXML2.DomDocument.6.0"); 
xml.async = false; 
boolval = xml.load("../Commands/commands.xml") 
if(!boolval) 
{ 
    WScript.Echo ("XML load error "); 
    WScript.Quit(); 
} 

var fso = new ActiveXObject("Scripting.FileSystemObject"); 
var outstr = xml.transformNode(xsl); 

var ofl = fso.CreateTextFile("../Commands/commands.html", true, false); 
ofl.Write (outstr); 
ofl.Close(); 

Also hier ist Iteration 2, statt die TransformNodeToObject Methode. In diesem Fall erhalte ich einen „nicht Angegeben Fehler“ Code 80004005 in msxml6.dll:

var xsl = new ActiveXObject("MSXML2.DomDocument.6.0"); 
xsl.async = false; 
var boolval = xsl.load("../Commands/commands.xsl"); 
if(!boolval) 
{ 
    WScript.Echo("XSL load error"); 
    WScript.Quit(); 
} 
var xml = new ActiveXObject("MSXML2.DomDocument.6.0"); 
xml.async = false; 
boolval = xml.load("../Commands/commands.xml") 
if(!boolval) 
{ 
    WScript.Echo ("XML load error "); 
    WScript.Quit(); 
} 

var result = new ActiveXObject("MSXML2.DomDocument.6.0"); 
xml.transformNodeToObject(xsl, result); 

result.save("../Commands/commands.html"); 

Meine Intuition sagt, dass der Prozessor nicht nur eine Datei zu erstellen, dass großen umgehen kann. Ist das richtig oder mache ich etwas falsch? Wenn es nur ein Größenproblem ist, gibt es eine andere Bibliothek/ein anderes Objekt, die/das ich in Vbscript/Jscript verwenden kann, um die Aufgabe zu erledigen?

Antwort

3

Einige kB XML werden MSXML unter keinen Umständen brechen. Der Speicher Ihrer Maschine ist begrenzt, daher kann die Dateigröße nicht das Problem sein. Auch die Wahl der Hostsprache (JScript oder VBScript) ist völlig irrelevant, es gibt nichts, was VBScript kann, aber JScript kann nicht, und umgekehrt. Du machst COM hier, also kann die Sprache auch nicht das Problem sein. Es ist sicher, in diese Richtung zu schauen.

Dies lässt eine Möglichkeit. Du musst etwas falsch machen. ;-) Dies kann MSXML-Konfiguration oder Installationsprobleme auf Ihrem Rechner beinhalten, vielleicht sogar falsche Einstellungen für den Dateisystemzugriff oder Prozessanmeldeinformationen.

Da ich in Ihrem Code kein unmittelbares Problem feststellen kann und Sie kein XML zum Testen bereitgestellt haben, kann ich nur einige Dinge empfehlen, die bei der Fehlersuche helfen können. Versuchen Sie, nicht unbedingt in dieser Reihenfolge:

  • Überprüfen Sie, ob alle Ihre XML-Dateien korrekt formatiert und korrekt codiert sind. Ich bin mir sicher, dass du damit schon fertig bist. Laden Sie sie in IE wird ausreichen, wenn das funktioniert, sind sie gut.
  • Entfernen Sie MSXML, und installieren Sie es erneut. Stellen Sie sicher, dass Sie auch eine ältere Version (4.0) installiert haben.
  • Laden Sie msxsl.exe from Microsoft herunter und führen Sie die Transformationen in der Befehlszeile aus, um zu überprüfen, ob sie überhaupt funktionieren - dieses kleine Tool verwendet intern MSXML und hat mich in der Vergangenheit nie im Stich gelassen.
  • Versuchen Sie Ihren Code mit "MSXML2.DomDocument.4.0", da es keinen auffallend guten Grund gibt, 6.0 sowieso zu verwenden (anders als "neuer ist besser", schätze ich).
  • Nur um es als Grund auszuschließen, führen Sie das Ganze als Benutzer auf Admin-Ebene und auf einem anderen Computer aus. Sehen Sie nach, ob der Fehler reproduzierbar ist.
  • Wenn alles andere fehlschlägt, lade die Dateien irgendwo hoch, poste die Links hier und ich werde sie mir auch ansehen.

Hoffnung, das hilft.

+0

Tomalak, Danke für die Hilfe. Ich habe alles ausprobiert. xml/xsl war wohlgeformt. Installation/Neuinstallation machte keinen Unterschied. Ich konnte es auf einer anderen Maschine reproduzieren. 4.0 ergab im Grunde die gleichen Ergebnisse (obwohl es bei Iteration 2 keine Fehler gab, sondern eine leere HTML-Datei erzeugte). msxsl.exe funktionierte großartig, so dass es die zu verwendende Lösung sein könnte, obwohl es frustrierend ist, dass ich es nicht mit dem Scripting arbeiten kann.Ich habe die Dateien auf http://www.obryantfamilytree.com/TestXSL.zip hochgeladen, meistens aus Neugierde, da die msxsl.exe-Lösung funktioniert, also wenn Sie so geneigt sind ... Nochmals vielen Dank. –

+2

Der Fehler ist - Sie können "TransformNodeToObject" und "" nicht zusammen verwenden. Ändern Sie es in "" und es wird funktionieren. (Hinweis: "TransformNodeToObject" versucht, die Ausgabe in einem XML-DOM zu speichern.) – Tomalak

+0

Darüber hinaus ist es im Allgemeinen empfehlenswert, das Transformationsergebnis über eine DOMDocument.save() zu speichern. Die Verwendung einer Zeichenfolge und eines TextStream-Objekts kann die Kohärenz zwischen deklarierter und tatsächlicher Codierung beeinträchtigen. – Tomalak