2010-01-11 10 views
4

XSL noobie mais uttery coincé!Les résultats de la transformation de script .NET Xsl dans 'System.Object' n'est pas défini ou importé

J'ai une transformation qui met en forme une date en utilisant la fonction de script C#, cela fonctionne très bien quand je suis en VS 2008 et exécutez "show xml output", la sortie est exactement ce que je veux.

Cependant, lorsque je tente d'exécuter ce code à l'aide que je reçois l'erreur

type prédéfini « System.Object » est pas défini ou importé

Pour fonctionner pour appeler la transformation des regards comme ça, il est assez basique et travaillé avant de commencer à utiliser les scripts

public static string RunXSLT(string xsltFile, string inputXML) 
{ 

    XslCompiledTransform transform = new XslCompiledTransform(); 
    XsltSettings settings = new XsltSettings(); 
    settings.EnableScript = true; 

    transform.Load(xsltFile, settings, null); 

    StringReader sReader = new StringReader(inputXML); 
    XmlTextReader xmlTextReader = new XmlTextReader(sReader); 

    //Create an XmlTextWriter which outputs to memory stream 
    Stream stream = new MemoryStream(); 
    XmlWriter xmlWriter = new XmlTextWriter(stream,> System.Text.Encoding.UTF8); 


    transform.Transform(xmlTextReader, xmlWriter); 

    stream.Position = 0; 

    XmlDocument XmlDoc = new XmlDocument(); 
    XmlDoc.Load(stream); 

    return XmlDoc.OuterXml; 
    } 

La transformation est ce XSL ..

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0" 
      xmlns:msxsl="urn:schemas-microsoft-com:xslt" 
      xmlns:nlbExtension="urn:nlbExtension" 
      exclude-result-prefixes="msxsl nlbExtension"> 

<xsl:output method="xml" indent="yes"/> 

<msxsl:script implements-prefix="nlbExtension" language="C#">  
<![CDATA[ 
    public string FormatDateTime(string xsdDateTime, string format) 
    { 
     DateTime date = DateTime.Parse(xsdDateTime); 

     return date.ToString(format); 
    } 
]]> 
</msxsl:script> 

<xsl:template match="/"> 
<urlset xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://www.sitemaps.org/schemas/sitemap/0.9 
    http://www.sitemaps.org/schemas/sitemap/0.9/sitemap.xsd" 
    xmlns="http://www.sitemaps.org/schemas/sitemap/0.9" 

    <xsl:for-each select="./Collection/Content" > 
    <url> 
     <loc>http://www.nlb.org<xsl:value-of select="./QuickLink/text()"/></loc> 
     <lastmod><xsl:value-of select="./DateModified/text()" /></lastmod> 
    </url> 
    </xsl:for-each>  
</urlset> 
</xsl:template> 
</xsl:stylesheet> 
+0

Pour info, un datetime xsd fonctionnerait mieux (OMI) 'XmlConvert.ToDateTime'. –

+0

Manquant un '>' sur

Répondre

1

Ne peut pas reproduire (en effet, vous ne l'utilisez pas réellement l'extension dans votre xslt). Je l'ai testé, en ajoutant (à la xslt):

<xsl:value-of select="nlbExtension:FormatDateTime(.,'dd MMM yyyy')"/> 

et en utilisant le code XML d'entrée:

string xml = new XElement("xml", DateTime.Now).ToString(); 

Et il a bien fonctionné (j'ai changé pour XmlConvert.ToDateTime pour correspondre au format de XSD, mais cela a fonctionné OK soit façon).

S'il y a un problème, c'est dans le code que vous ne nous montrez pas.

0

est ici un simple exemple, (désolé faute de frappe), encore une fois cela fonctionne dans VS2008 juste en cours d'exécution XML contre la feuille de style, mais en utilisant le code C# Je reçois

type prédéfini « System.Object » est non défini ou importé

code

public void RunFileXSLT() 
{ 
    // Open books.xml as an XPathDocument. 
    XPathDocument doc = new XPathDocument("c:\\temp\\raw.xml"); 

    // Create a writer for writing the transformed file. 
    XmlWriter writer = XmlWriter.Create("c:\\temp\\OutputTest.xml"); 

    // Create and load the transform with script execution enabled. 
    XslCompiledTransform transform = new XslCompiledTransform(); 
    XsltSettings settings = new XsltSettings(); 
    settings.EnableScript = true; 
    transform.Load("c:\\temp\\Simple.xslt", settings, null); 

    // Execute the transformation. 
    transform.Transform(doc, writer); 
} 

le xml est ce

<xml> 
    <item> 
    <date>11/11/2009</date> 
    </item> 
    <item> 
    <date>11/11/2009</date> 
    </item> 
</xml> 

la transformation est ce

<?xml version="1.0" encoding="ISO-8859-1"?> 

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0" 
      xmlns:msxsl="urn:schemas-microsoft-com:xslt" 
      xmlns:nlbExtension="urn:nlbExtension" 
      exclude-result-prefixes="msxsl nlbExtension"> 
       <xsl:output method="xml" indent="yes"/> 


      <msxsl:script implements-prefix="nlbExtension" language="C#">  
<![CDATA[ 
    public string FormatDateTime(string xsdDateTime, string format) 
    { 
     DateTime date = DateTime.Parse(xsdDateTime); 

     return date.ToString(format); 
    } 
]]> </msxsl:script> 


<xsl:template match="/"> 
    <urlset xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xsi:schemaLocation="http://www.sitemaps.org/schemas/sitemap/0.9 
     http://www.sitemaps.org/schemas/sitemap/0.9/sitemap.xsd" 
     xmlns="http://www.sitemaps.org/schemas/sitemap/0.9" > 
    <xsl:for-each select="./xml/item" > 
    <url> 
     <loc>http://www.a-website.com</loc> 
     <lastmod> 
     <xsl:value-of select="nlbExtension:FormatDateTime(./date,'s')"/> 
     </lastmod> 
    </url> 
    </xsl:for-each>  
</urlset> 

+0

Fonctionne bien pour moi: ' http://www.a-website.com 2009-11-11T00: 00: 00 http://www.a-website.com 2009-11-11T00: 00: 00 ' –

+0

hmm crikey, je me demande ce que le problème est là. Le XSL ressemble à droite et le .NET est à peu près couper-coller à partir de MSDN exemple, . Problème d'installation .net ?? Saisir des pailles ici – Chris

4

Je sais que cette question est très ancienne, mais peut-être que cela aide quelqu'un qui cherche ce problème.

Je suis actuellement devenu le même erreur de compilation mais dans un sujet totalement différent de la programmation C#. J'utilise Sharp Develop 4.2 et j'ai eu le même problème. Pour moi, la solution était de ajouter "mscorlib" aux références du projet.

Cette erreur est un problème connu de Microsoft, mais ne connaît pas la situation actuelle. Je viens de trouver quelques discussions de 2010.

D'une certaine manière cette référence manquait et je ne comprends pas vraiment pourquoi d'autres projets de moi fonctionnent sans référence explicite à mscorlib, mais peut-être est-ce bien le bug lui-même ;-)

Meilleures salutations Thomas

+0

J'ai essayé d'ajouter mscorlib aux références du projet et cela n'a pas fonctionné. Je vous remercie. – Frank