2010-05-13 1 views
1

У меня есть компонент, написанный на C#. Помимо прочего, он выполняет преобразование XSL на данные XML, которые он собирает. Когда я тестирую эту функцию, используя другой проект C#, который использует компонент, он работает отлично. Однако, когда я экспортирую компонент в виде COM-компонента и пытаюсь использовать эту функцию из приложения, он не работает в команде XslCompiledTransform.Load с ошибкой компиляции XSLT.Ошибка компиляции XSLT при использовании XslCompiledTransform.Load косвенно вызвана из приложения

Здесь C# код: (click_me)

И ошибка я получаю копируется в файл. Его можно найти здесь: (click_me)

Файл XSLT вместе с количеством шаблонов также состоит из «сценария C#», предназначенного для некоторых продвинутых вычислений, для которых XSLT не способен.

Вот типичный код XSL, который я использую:

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

    <msxsl:script language="C#" implements-prefix="cs"> 
    <![CDATA[ 
    private static string[] formats_datetime = new string[] 
    { 
     "MM/dd/yyyy HH:mm:ss" 
    }; 

    public string date_add(string date_str, string time_span_par) 
     { 
      DateTime date_value; 
      TimeSpan time_span_var = TimeSpan.Parse(time_span_par); 

      DateTime.TryParseExact(date_str, formats_datetime, new global::System.Globalization.CultureInfo("en-US"), global::System.Globalization.DateTimeStyles.None, out date_value); 
      date_value = date_value.Add(time_span_var); 
      string temp = date_value.ToString("MM/dd/yyyy HH:mm:ss"); 
      return(temp); 
     } 
]]> 
    </msxsl:script> 

    <xsl:template match="@* | node()"> 
    <xsl:copy> 
     <xsl:apply-templates select="@*| node()"/> 
    </xsl:copy> 
    </xsl:template> 

    <xsl:template match="date_node"> 
    <xsl:variable name="date_in"> 
     <xsl:value-of select="."/> 
    </xsl:variable> 
    <xsl:variable name="period"> 
     <xsl:value-of select="'06:00:00'"/> 
    </xsl:variable> 
    <xsl:copy> 
     <xsl:value-of select="cs:date_add($date_in, $period)"/> 
    </xsl:copy> 
    </xsl:template> 
</xsl:stylesheet> 

И содержание XML:

<?xml version="1.0" encoding="utf-8"?> 
<root> 
    <node1>34</node1> 
    <node2>23</node2> 
    <date_node>12/31/2020 23:59:59</date_node> 
    <child> 
    <node1>text</node1> 
    <date_node>12/31/2020 23:59:59</date_node> 
    <grand_child> 
     <date_node>12/31/2020 23:59:59</date_node> 
    </grand_child> 
    </child> 
</root> 
+0

Итак, почему бы вам не представить полный пример? Нам не хватает XSLT - минимальный пример, который показывает, что проблема будет в порядке. Если я должен исследовать проблему, мне нужно начать с повторного использования этой проблемы на моем компьютере. В противном случае я могу просто сказать вам, что будет завтра. :) –

ответ

2

Я надеюсь, что замена встроенных сценариев с вызовами функций расширения (методы объекта расширения, которые передаются преобразованию) решают проблему.

Рекомендуется использовать функции расширения в предпочтении по встроенным скриптам. Если встроенные скрипты широко используются в среде сервера IIS, это может привести (и это наблюдается) к утечкам памяти, что в конечном итоге приведет к снижению уровня сервера. Это связано с тем, что XslCompiledTransform компилирует сценарии в динамические dll, которые нельзя выгружать до тех пор, пока IIS не будет переработана.

+0

@ Dimitre, рад получить ваш ответ. (хотя я догадался) приятно читать слова «XSLT не имеет к этому никакого отношения» :)) –

+0

@ младенец-программист: вас всегда приветствуют. :) –

+0

@ Dimitre, извините за поздний ответ. На самом деле я не знал вашего комментария. Только что увидел ваш комментарий, поэтому отредактировал мой пост соответственно. С уважением. –

Смежные вопросы