2011-12-22 88 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 - 是的,應該解決它。 –

相關問題