Результаты преобразования сценария .NET Xsl в System.Object не определены или не импортированы - PullRequest
6 голосов
/ 11 января 2010

XSL новичок, но застрял!

У меня есть преобразование, которое форматирует дату с использованием функции сценариев c #, это прекрасно работает, когда я в VS 2008 и запускаю «show xml output», вывод - именно то, что я хочу.

Однако, когда я пытаюсь запустить это, используя код, я получаю ошибку

Предопределенный тип 'System.Object' не является определено или импортировано

Чтобы функция для вызова преобразования была похожа на это, она довольно проста и работала до того, как я начала использовать сценарии

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;
  }

Преобразование 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>

Ответы [ 3 ]

4 голосов
/ 27 июня 2013

Я знаю, что эта проблема очень старая, но, возможно, это поможет кому-то, кто ищет эту проблему.

Я сейчас стал такой же ошибкой компиляции , но в совершенно другой теме программирования на C #.

Я использую Sharp Develop 4.2 и у меня возникла та же проблема. Для меня решение было добавить «mscorlib» к ссылкам проекта.

Эта ошибка является известной проблемой Microsoft, но не знает текущей ситуации. Просто нашел некоторые обсуждения с 2010 года.

Почему-то эта ссылка отсутствовала, и я не до конца понимаю, почему другие мои проекты работают без явной ссылки на mscorlib, но, возможно, это действительно ошибка;

С наилучшими пожеланиями Thomas

1 голос
/ 11 января 2010

Невозможно воспроизвести (действительно, вы на самом деле не используете расширение в вашем xslt). Я проверил это, добавив (к xslt):

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

и используя входные данные xml:

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

И все работало нормально (я изменил на XmlConvert.ToDateTime для соответствия формату xsd, но в любом случае работал нормально).

Если есть проблема, то это в коде, который вы нам не показываете.

0 голосов
/ 11 января 2010

Вот более простой пример (извините за опечатку), снова это работает в VS2008, просто запустив XML для таблицы стилей, но используя код C #, я получаю

Предопределенный тип 'System.Object' не определен или не импортирован

Код

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

xml это

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

Преобразование это

<?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>   

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...