Почему включение узла TranslatedText приводит к сбою XslCompiledTransform? - PullRequest
2 голосов
/ 23 декабря 2011

Я вижу странное поведение (или я что-то упускаю) со следующим тестом 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.Убедитесь, что для параметра ConformanceLevel установлено значение ConformanceLevel.Fragment или ConformanceLevel.Auto, если вы хотите записать фрагмент XML.

Единственное различие между двумя фрагментами XML заключается в следующем узле:

<TranslatedText>3</TranslatedText>

Кто-нибудь имеет представление о том, что происходит?

Точно так же, как вы знаете, я знаю, что вызов TransformXml2 не делает ничего полезного.Я просто хотел предоставить некоторый исполняемый код, который демонстрирует ошибку.

1 Ответ

2 голосов
/ 23 декабря 2011

Причина в том, что второй ввод содержит текст после элемента <simple>simple</simple>, который вы не обрабатываете.Стандартный (встроенный) шаблон для обработки текстовых узлов выводит этот текст после <node></node>, в результате чего получается документ, который не является правильно сформированным:

<node/>


      3

Это то, о чем процессор предупреждает вас.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...