2011-12-22 45 views
2

我看到一些奇怪的行为(或者我失去了一些东西)具有以下NUnit测试:为什么包含TranslatedText节点会导致XslCompiledTransform失败?

 [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

找到了dup:http://stackoverflow.com/questions/3288606/writing-xml-in-c-sharp-token-startelement-in-state-epilog-would-result-in-an –

回答

2

原因是第二个输入包含您未处理的<simple>simple</simple>元素之后的文本。用于处理文本节点的默认(内置)模板输出<node></node>后的文本,这将导致一个文档中,这不是良好的形成:

<node/> 


     3 

这就是该处理器被警告你。

+0

所以是正确的方法来解决这个有一个空的模板为该节点? –

+0

@LeslieHanks - 是的,应该解决它。 –

相关问题