C # xslt Ссылка на объект ошибки BizTalk не установлена ​​на экземпляр - PullRequest
0 голосов
/ 05 апреля 2011

Я преобразую XML, используя следующий код. Он отлично работает для одного xslt, но выдает исключение: ссылка на объект не установлена ​​для экземпляра объекта. Я проверил оба xslt, они работают нормально по отдельности (что означает создание ожидаемого XML после преобразования). Может кто-нибудь подсказать мне, что тут не так. Я попытался выполнить некоторую отладку, но не могу получить подробности об ошибке или трассировку стека, поскольку это приложение BizTalk, которое развернуто на сервере .... Заранее спасибо Вот код.

 public static XmlDocument ApplyTransform(
       XmlDocument toTransform,
       XmlDocument StyleSheet)
   {
       XslCompiledTransform xslt = new XslCompiledTransform();
       XmlDocument transformedDoc = new XmlDocument();
       Stream stream = new MemoryStream();
       StreamWriter sw = new StreamWriter(stream);

       log4net.Ext.Serializable.SLog logger;
       logger = log4net.Ext.Serializable.SLogManager.GetLogger(@"BizTalk", typeof(RuntimeFileReader));
       logger.RegistryConfigurator();

       string logMsg = string.Format("StyleSheet used: {0}", StyleSheet);
       logger.Debug(logMsg);

       try
       {
           xslt.Load(StyleSheet);
           xslt.Transform(toTransform, null, sw);
           stream.Seek(0, SeekOrigin.Begin);
           transformedDoc.Load(stream);
       }
       catch
       {
           return null;
       }
       finally
       {
           if (sw != null)
           {
           sw.Flush();
           sw.Close();
           }
       }
       string gMsg = string.Format("xml after Transformation : {0}", transformedDoc.OuterXml);
       logger.Debug(gMsg);

       return transformedDoc;
   }

А вот XSLT, который выдает исключение.

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

  <xsl:output method="xml" omit-xml-declaration="yes"/>
  <xsl:strip-space elements="Item"/>
  <xsl:template match="node()|@*" xml:space="default">
    <xsl:copy>
      <xsl:apply-templates select="node()|@*"/>
    </xsl:copy>
  </xsl:template>

  <xsl:template match="errorCodes"/>
</xsl:stylesheet>

Код Biztalk:

PIToIMTransform = new System.Xml.XmlDocument();     
PIToIMTransform.Load(
                      gh.BizTalk.Components.RuntimeFileReader
                      .GetResourceFilePath("­PInode.xslt"));
if (logger.IsDebugEnabled) {
      xmlDoc = PIToIMTransform; 
      logger.DebugFormat(logProps, "XSLT being used for transform: {0}", xmlDoc.OuterXml);
}
xmlDoc = gh.BizTalk.Components
           .XmlUtility.ApplyTransform(PItransformedDoc, PIToIMTransform); 
if (logger.IsDebugEnabled){
       logger.DebugFormat(logProps, "PI Message AFTER removed errorCodes transform: {0}"
              , xmlDoc.OuterXml);
} 

1 Ответ

1 голос
/ 05 апреля 2011

Когда вы возвращаетесь в BizTalk, вы ссылаетесь на нулевой объект и вылетаете (xmlDoc.OuterXml), xmlDoc равен нулю и в основном выполняет null.OuterXml:

mlDoc = gh.BizTalk.Components
       .XmlUtility.ApplyTransform(PItransformedDoc, PIToIMTransform); 
if (logger.IsDebugEnabled){
   logger.DebugFormat(logProps, "PI Message AFTER removed errorCodes transform: {0}"
          , xmlDoc.OuterXml);
} 

Предлагаем защитить вызов xmlDoc, а также распечатать в вашем блоке обработки исключений создаваемое исключение. Что-то идет не так в вашем критическом разделе, это может быть ошибка разбора, это может быть ошибка загрузки xsl, попробуйте это:

   catch (Exception e)
   {
       logger.Error(e);
       return ;
   }

А затем дайте нам знать об исключении, которое выдается.

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