XML转换错误 - 无法将指定的节点作为此节点的有效子节点插入,因为指定的节点类型错误

时间:2011-12-08 15:00:42

标签: c# xml xslt

在尝试将代码中生成的XML转换为纯文本输出时,我一直遇到上述错误。

我的.xsl文件是:

<xsl:transform version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
   <xsl:output method="text"/>
      <xsl:template match="/">
          <xsl:text>Test</xsl:text>
      </xsl:template>
</xsl:transform>

我的C#方法代码是:

       if( !File.Exists( xslPath ) )
            throw new Exception( "XSL File (" + xslPath + ") does not exist" );

        XslTransform docXsl = new XslTransform();
        docXsl.Load( xslPath );

        XmlDocument docXml = new XmlDocument();

        XmlElement emailNode = docXml.CreateElement("Email");
        docXml.AppendChild( emailNode );

        XmlResolver xres = null;
        XmlReader xr = docXsl.Transform( docXml, null, xres );

        XmlDocument xmldoc = new XmlDocument();
        xmldoc.Load( xr );

        return xmldoc.OuterXml;

生成的XML非常简单,只需

<Email/>

如果我从XSL中删除节点,那么我不会收到错误。

我无法弄清楚为什么会这样。任何帮助将不胜感激。

由于

1 个答案:

答案 0 :(得分:0)

你想要实现的目标是什么?如果您使用的是.NET 2.0或更高版本,则根本不应使用XslTransform,而应使用XslCompiledTransform。如果您想要纯文本输出,那么尝试将该转换结果加载到XmlDocument中没有任何意义,因为该对象模型旨在包含格式良好的XML文档而不是某些纯文本。所以这就是我认为你得到错误的原因,你的转换结果是带有单个文本节点的纯文本,然后你尝试将该单个文本节点加载到XmlDocument中,该XmlDocument查找不存在的根元素。 考虑告诉您使用哪个.NET版本/目标以及您想要的输出类型(例如纯文本文件或带有转换结果的字符串),然后我们可以指出XslCompiledTransform的{Transform 3方法的正确重载{{3得到那个结果。

例如,如果转换输入是XmlDocument或实现IXPathNavigable的其他对象,则可以使用http://msdn.microsoft.com/en-us/library/system.xml.xsl.xslcompiledtransform.transform.aspx转换为StringWriter以获取String结果,如下所示:

XslCompiledTransform proc = new XslCompiledTransform();
proc.Load(xslPath);

string result;

using (StringWriter sw = new StringWriter())
{
  proc.Transform(docXml, null, sw);
  result = sw.toString();
}

return result;