我通过以下nUnit测试看到了一些奇怪的行为(或者我遗漏了一些东西):
[Test]
public void Test() {
const string works = @"
<doc>
<simple>simple</simple>
<ItemDef>
<Description>
</Description>
</ItemDef>
</doc>
";
const string doesntWork = @"
<doc>
<simple>simple</simple>
<ItemDef>
<Description>
<TranslatedText>3</TranslatedText>
</Description>
</ItemDef>
</doc>
";
string xsl = @"<?xml version='1.0' encoding='iso-8859-1'?>
<xsl:stylesheet version='1.0' xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>
<xsl:output indent='yes'/>
<xsl:template match='simple'>
<node>
</node>
</xsl:template>
</xsl:stylesheet>
";
TransformXml2(works, xsl);
TransformXml2(doesntWork, xsl);
}
protected static void TransformXml2(string xml, string xsl) {
XslCompiledTransform transform = new XslCompiledTransform();
transform.Load(XmlReader.Create(new StringReader(xsl)));
XmlDocument document = new XmlDocument();
document.LoadXml(xml);
XmlReader input = new XmlNodeReader(document.DocumentElement);
transform.Transform(input, new XsltArgumentList(), XmlTextWriter.Create(new StringBuilder()));
}
当我运行此测试时,第二个TransformXml2调用失败,并显示以下错误:
状态EndRootElement中的标记文本将导致XML文档无效。如果要编写XML片段,请确保将ConformanceLevel设置设置为ConformanceLevel.Fragment或ConformanceLevel.Auto。
两个XML之间的唯一区别是以下节点:
<TranslatedText>3</TranslatedText>
任何人都知道发生了什么事?
您知道,我知道TransformXml2调用没有任何用处。我只想提供一些演示错误的可执行代码。
答案 0 :(得分:2)
原因是第二个输入包含您未处理的<simple>simple</simple>
元素之后的文本。用于处理文本节点的默认(内置)模板是在<node></node>
之后输出该文本,这会导致文档格式不正确:
<node/>
3
这就是处理器警告你的事情。