Ошибка компиляции XSLT при использовании XslCompiledTransform.Load, косвенно вызванного из приложения - PullRequest
1 голос
/ 13 мая 2010

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

Вот код C #: (click_me)

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

Файл XSLT вместе с количеством шаблонов также состоит из «C # script», предназначенного для некоторых сложных вычислений, на которые 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>

1 Ответ

2 голосов
/ 13 мая 2010

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

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

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