Преобразование XSL через код не приводит к тому же результату, что и преобразование XSL, выполненное с помощью инструмента - PullRequest
1 голос
/ 27 июля 2010

Я преобразовываю свой XML-файл в другой XML-файл, используя классы XslCompiledTransform, доступные в .NET Framework 3.5

Вот мой код.

private static void transformUtil(string sXmlPath, string sXslPath, string outputFileName)
    {
        try
        {

            XPathDocument myXPathDoc = new XPathDocument(sXmlPath);
            XslCompiledTransform myXslTrans = new XslCompiledTransform();
            //load the Xsl 
            myXslTrans.Load(sXslPath);
            //create the output stream
            XmlTextWriter myWriter = new XmlTextWriter(outputFileName, null);
            //do the actual transform of Xml
            myXslTrans.Transform(myXPathDoc, null, myWriter);
            myWriter.Close();
        }
        catch (Exception e)
        {

            EventLogger eventLog;
            eventLog = new EventLogger("transformUtil", e.ToString());
        }

    }
}

Код работает, но выходной файл не имеет декларации XML в заголовке.

**<?xml version="1.0" encoding="utf-8"?>**

Я затрудняюсь понять это. Когда я использую тот же XSL-файл для преобразования XML, используя такой инструмент, как notepad ++ или visual studio, преобразование содержит объявление XML в заголовке. Так отвечает ли XslCompiledTransform за усечение этого объявления? Я озадачен.

Кто-нибудь еще сталкивался с подобными проблемами?

Заголовок моего XSL-файла выглядит следующим образом.

<?xml version="1.0" encoding="iso-8859-1"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
    <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes" />
<xsl:template match="/">

1 Ответ

1 голос
/ 10 ноября 2010

Используемое средство записи XML не имеет никаких настроек, связанных с ним.

изменение

//create the output stream
XmlTextWriter myWriter = new XmlTextWriter(outputFileName, null);

до

XmlWriterSettings settings = 
   new XmlWriterSettings
   {
      OmitXmlDeclaration = false
   };
XmlWriter myWriter = XmlWriter.Create(outputFileName, settings);

В качестве альтернативы, вы можете сделать меньше для настройки преобразования:

private static void transformUtil(string sXmlPath, string sXslPath, 
                                  string outputFileName)
{
    try
    {
       XslCompiledTransform xsl = new XslCompiledTransform();

       // Load the XSL
       xsl.Load(sXslPath);

       // Transform the XML document
       xsl.Transform(sXmlPath, outputFileName);
    }
    catch (Exception e)
    {
       // Handle exception
    }

}

Это также должно учитывать инструкции xsl: output из самого файла XSLT, в частности атрибут omit-xml-declaration, для которого значением по умолчанию является "нет", если не указано.

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