2009-06-26 10 views
2

J'essaie d'avoir un script qui transforme automatiquement un fichier xml en plusieurs fichiers html en utilisant différentes feuilles de style xslt. Cependant, quoi que j'essaie, j'ai des erreurs. Je l'ai essayé à la fois dans VBScript et JScript, et tous les deux me donnent des erreurs. Le fichier xml est de 537 Ko et le fichier xsl de 5 Ko.Erreur JScript/VBScript

Voici l'itération 1 dans JScript. Ce script fonctionne pour l'une de mes feuilles de style (une feuille de style qui crée un fichier html plus petit), mais sur une feuille de style qui crée un fichier html plus grand, elle me donne un "appel ou argument de procédure invalide". « t revenir correctement) erreur:

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(); 

itération 2 est donc ici, en utilisant la méthode transformNodeToObject à la place. Dans ce cas, je reçois une « erreur non spécifiée » Code 80004005 à 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"); 

Mon intuition dit que le processeur ne peut pas gérer la création d'un fichier grand. Est-ce exact, ou fais-je quelque chose de mal? Si c'est juste un problème de taille, y a-t-il une autre bibliothèque/objet que je peux utiliser dans vbscript/jscript pour faire le travail?

Répondre

3

Quelques Ko de XML ne casseront pas MSXML, en aucun cas. La mémoire de votre machine est la limite, donc la taille du fichier ne peut pas être le problème. De plus, le choix du langage hôte (JScript ou VBScript) est complètement hors de propos, il n'y a rien que VBScript puisse faire mais JScript ne peut pas, ou vice-versa. Vous faites COM ici, donc la langue ne peut pas être le problème non plus. Il est prudent d'arrêter de regarder dans cette direction.

Cela laisse une possibilité. Vous devez faire quelque chose de mal. ;-) Cela peut inclure des problèmes de configuration ou d'installation MSXML sur votre machine, voire des paramètres d'accès au système de fichiers ou des informations d'identification de processus erronées.

Étant donné que je ne peux pas identifier un problème immédiat dans votre code et que vous n'avez fourni aucun code XML pour tester, je ne peux que recommander quelques éléments qui pourraient vous aider à le déboguer. Essayez, pas nécessairement dans cet ordre:

  • Vérifiez que tous vos fichiers XML sont bien formés et correctement codés. Je suis sûr que vous avez déjà terminé. Les charger dans IE sera suffisant, si cela fonctionne, ils sont bons.
  • Supprimez et réinstallez MSXML, assurez-vous également qu'une ancienne version (4.0) est installée.
  • Télécharger msxsl.exe from Microsoft et faire les transformations sur la ligne de commande, pour vérifier si elles fonctionnent du tout - ce petit outil utilise MSXML en interne et n'a jamais échoué dans le passé.
  • Essayez votre code avec "MSXML2.DomDocument.4.0", car il n'y a aucune raison d'une manière frappante d'utiliser 6.0 de toute façon (autre que "plus récent, c'est mieux", je suppose). Pour l'exclure comme raison, exécutez le tout en tant qu'utilisateur de niveau Admin et sur une machine différente. Voyez si l'erreur est reproductible.
  • Si tout le reste échoue, téléchargez les fichiers quelque part, publiez les liens ici et je les regarderai aussi.

Espérons que cela aide.

+0

Tomalak, Merci pour l'aide. J'ai essayé tout ce qui précède. xml/xsl était bien formé. L'installation/ré-installation n'a fait aucune différence. J'ai été capable de le reproduire sur une machine différente. 4.0 donnait essentiellement les mêmes résultats (bien qu'à l'itération 2 il ne donnait pas d'erreur mais produisait un fichier html vide). msxsl.exe a très bien fonctionné, donc c'est peut-être la solution à utiliser, même s'il est frustrant de ne pas pouvoir l'utiliser avec les scripts.J'ai téléchargé les fichiers sur http://www.obryantfamilytree.com/TestXSL.zip, surtout pour la curiosité, puisque la solution msxsl.exe fonctionne, donc si vous êtes si incliné ... Merci encore. –

+2

L'erreur est - vous ne pouvez pas utiliser "TransformNodeToObject" et "" ensemble. Changez-le en "" et cela fonctionnera. (Indice: "TransformNodeToObject" tente de sauvegarder la sortie dans un DOM XML.) – Tomalak

+0

Au-delà, je pense qu'il est généralement recommandé d'enregistrer le résultat de la transformation via un DOMDocument.save(). L'utilisation d'une chaîne et d'un objet TextStream peut gâcher la cohérence entre le codage déclaré et le codage réel. – Tomalak