2011-04-05 27 views
0

我正在使用以下代码转换xml。 它适用于一个xslt,但它会抛出异常:对象引用未设置为对象的实例。 我已验证两个xslt他们工作正常单独(意味着生成转换后预期的XML)。 有人可以指导我弄清楚这里有什么问题。我曾尝试做一些调试,但无法获取错误详细信息或堆栈跟踪,因为它是部署在服务器上的BizTalk应用程序....预先感谢 以下是代码。C#xslt未将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); 
} 
+0

你能访问Biztalk服务器上的事件日志吗? – Nix 2011-04-05 14:35:12

+0

并且有代码块在biztalk里面工作过吗? – Nix 2011-04-05 14:36:46

+0

@Nix。我已经检查过事件日志没有错误或警告。 – JohnXsl 2011-04-05 14:47:11

回答

1

当你回到到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调用,并打印出您的异常手ling阻止正在抛出的异常。事情错在你的关键部分它可能是一个语法错误,它可能是一个xsl加载错误试试这个:

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

然后让我们知道,被抛出的异常。

+0

&@Daniel谢谢你的帮助。我已经找到了问题。我在第二个XSLT中使用了。这是造成这个问题。因为在你的帮助下,我能够解决问题,所以我会将你的回答标记为答案。再次感谢您的帮助。 – JohnXsl 2011-04-05 20:14:52

相关问题