2010-05-21 3 views
11

Je travaille actuellement sur un projet qui implique beaucoup de transformations XSLT et je vraiment besoin d'un débogueur (je XSLT qui sont plus de 1000 lignes à long et je ne écrivez-les :-).Debugging XSLT avec des objets d'extension dans Visual Studio 2010

Le projet est écrit en C# et utilise des objets d'extension:

xslArg.AddExtensionObject("urn:<obj>", new <Obj>()); 

De ma connaissance, dans cette situation Visual Studio est le seul outil qui peut me aider à résoudre les transformations étape par étape. Le débogueur statique ne sert à rien à cause des objets d'extension (il lance une erreur lorsqu'il atteint des éléments qui référencent leur espace de noms). Heureusement, j'ai trouvé this thread qui m'a donné un point de départ (au moins je sais que cela peut être fait). Après avoir recherché MSDN, j'ai trouvé les critères qui rendent possible le passage dans la transformation.

Ils sont répertoriés here. En bref: (. XmlReader & co)

  • le XML et XSLT doit être chargé par une classe qui a l'interface IXmlLineInfo
  • le résolveur XML utilisé dans le constructeur XSLTCompiledTransform est basé sur des fichiers (XmlUriResolver devrait fonctionner).
  • la feuille de style devrait être sur la machine locale ou sur l'intranet (?)

D'après ce que je peux dire, je forme tous ces critères, mais il ne fonctionne toujours pas. Les exemples de code pertinents sont affichés ci-dessous:

// [...] 

xslTransform = new XslCompiledTransform(true); 

xslTransform.Load(XmlReader.Create(new StringReader(contents)), null, new BaseUriXmlResolver(xslLocalPath)); 

// [...] 

// I already had the xml loaded in an xmlDocument 
// so I have to convert to an XmlReader 
XmlTextReader r = new XmlTextReader(new StringReader(xmlDoc.OuterXml)); 

XsltArgumentList xslArg = new XsltArgumentList(); 
xslArg.AddExtensionObject("urn:[...]", new [...]()); 
xslTransform.Transform(r, xslArg, context.Response.Output); 

Je ne comprends vraiment pas ce que je fais de mal. J'ai vérifié les interfaces sur les objets XmlReader et ils implémentent le requis. En outre, BaseUriXmlResolver hérite de XmlUriResolver et la feuille de style est stockée localement. La capture d'écran ci-dessous est ce que je reçois en entrant dans la fonction Transform. D'abord, je peux voir le code stylesheet après avoir quitté les paramètres (sur le modèle match), je reçois ceci:

The error I get when I step into the stylesheet http://img339.imageshack.us/img339/4153/scrxslterror.jpg

Si quelqu'un a une idée pourquoi il ne fonctionne pas ou a une autre façon d'obtenir pour travailler je serais très obligé :).

Merci,
Alex

Répondre

2

Je ne suis pas sûr de l'utilisation d'objets d'extension mais comme je comprends votre problème est avec le débogage de la transformation XSLT en code dans VS2010. Voici la fonction que nous utilisons pour debug transformation XSLT:

public string ApplyTransformation(string inputFilePath, string xsltFileContent) 
    { 
     XslCompiledTransform transform = new XslCompiledTransform(debugEnabled); 

     File.WriteAllText(xsltTempFilePath,xsltFileContent); 
     transform.Load(xsltTempFilePath, XsltSettings.TrustedXslt, new XmlUrlResolver()); 

     XmlReader reader = XmlReader.Create(inputFilePath); 
     StringWriter output = new StringWriter(); 
     XmlWriter writer = XmlWriter.Create(output,transform.OutputSettings); 
     transform.Transform(reader,writer); 
     return output.ToString(); 
    } 

Malheureusement, il y a un bug avec le débogueur XSLT VS2010 qui fera de votre expérience de débogage pire que dans VS2008.

+0

Concernant le bug: Cela a-t-il fonctionné avec VS 2008? Je ne faisais que travailler avec le XSLT chargé à partir d'un fichier sur le disque. –

+0

Je viens de le tester avec VS 2008 SP1. Ça marche. – mfilimonov

0

Envisagez le débogage à l'aide du débogueur XML Spy XSLT. Cela fonctionne pour moi tout le temps.

+0

Après un coup d'oeil rapide, je n'ai rien trouvé en rapport avec les objets d'extension. Est-ce que cela les soutient? –