Ошибка преобразования XML - указанный узел не может быть вставлен как действительный дочерний элемент этого узла, поскольку указанный узел имеет неправильный тип - PullRequest
0 голосов
/ 08 декабря 2011

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

Мой файл .xsl:

<xsl:transform version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
   <xsl:output method="text"/>
      <xsl:template match="/">
          <xsl:text>Test</xsl:text>
      </xsl:template>
</xsl:transform>

И мой код метода C #:

       if( !File.Exists( xslPath ) )
            throw new Exception( "XSL File (" + xslPath + ") does not exist" );

        XslTransform docXsl = new XslTransform();
        docXsl.Load( xslPath );

        XmlDocument docXml = new XmlDocument();

        XmlElement emailNode = docXml.CreateElement("Email");
        docXml.AppendChild( emailNode );

        XmlResolver xres = null;
        XmlReader xr = docXsl.Transform( docXml, null, xres );

        XmlDocument xmldoc = new XmlDocument();
        xmldoc.Load( xr );

        return xmldoc.OuterXml;

Сгенерированный XML очень прост, просто

<Email/>

Если я удаляю узел из XSL, я не получаю ошибку.

Я не могу понять, почему это происходит. Любая помощь будет принята с благодарностью.

Спасибо

1 Ответ

0 голосов
/ 08 декабря 2011

Чего вы хотите достичь?Если вы используете .NET 2.0 или более позднюю версию, вы вообще не должны использовать XslTransform, а скорее XslCompiledTransform.И если вы хотите выводить простой текст, то нет смысла пытаться загрузить этот результат преобразования в XmlDocument, поскольку эта объектная модель должна содержать правильно сформированный XML-документ, а не какой-либо простой текст.Поэтому я думаю, что по этой причине вы получаете ошибку, ваш результат преобразования - простой текст с одним текстовым узлом, а затем вы пытаетесь загрузить этот единственный текстовый узел в XmlDocument, который ищет корневой элемент, который не существует.Рассмотрим, какую версию .NET вы используете / target и какой тип вывода вы хотите (например, простой текстовый файл или строку с результатом преобразования), тогда мы можем указать вам правую перегрузку метода Transform XslCompiledTransform http://msdn.microsoft.com/en-us/library/system.xml.xsl.xslcompiledtransform.transform.aspx для получения этого результата.

Например, если входные данные преобразования представляют собой XmlDocument или другой объект, реализующий IXPathNavigable, вы можете использовать http://msdn.microsoft.com/en-us/library/ms163435.aspx для преобразования в StringWriter, чтобы получить результат String какследует:

XslCompiledTransform proc = new XslCompiledTransform();
proc.Load(xslPath);

string result;

using (StringWriter sw = new StringWriter())
{
  proc.Transform(docXml, null, sw);
  result = sw.toString();
}

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