在尝试将代码中生成的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中删除节点,那么我不会收到错误。
我无法弄清楚为什么会这样。任何帮助将不胜感激。
由于
答案 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;