为什么包含TranslatedText节点会导致XslCompiledTransform失败?

时间:2011-12-22 22:42:40

标签: .net xslt

我通过以下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调用没有任何用处。我只想提供一些演示错误的可执行代码。

1 个答案:

答案 0 :(得分:2)

原因是第二个输入包含您未处理的<simple>simple</simple>元素之后的文本。用于处理文本节点的默认(内置)模板是在<node></node>之后输出该文本,这会导致文档格式不正确:

<node/>


      3

这就是处理器警告你的事情。