Пользовался XSLT преобразованиями лет 10 на JAVA под Linux, а тут появилась надобность реализовать на паскале под винду.
На первый взгляд все просто, но при ближайшем рассмотрении... В общем наступил. И как проблему решить не знаю. Бьюсь уже который день.
На борту Windows XP со всеми последними обновлениями.
Проблем даже несколько.
1. MSXML почему-то игнорирует стандартные описания в XSL/XML. Например, у меня оба документа в кодировке UTF-8, и в описании результирующего файла стоит что он должен быть в кодировке UTF-8.
XML заголовок
- Код: Выделить всё
- <?xml version="1.0" encoding="utf-8"?>
Ну и весь файл, естественно, создан в этой кодировке.
XSL заголовок
- Код: Выделить всё
- <?xml version="1.0" encoding="utf-8"?>
 <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
 <xsl:output method="html" indent="yes" encoding="utf-8"/>
Ну и весь файл, естественно, создан в этой кодировке.
Не смотря на все это после трансформации получаю HTML файл в кодировке win-1251!!!!!! Хотя трансформатор добавляет мета тег
- Код: Выделить всё
- <META http-equiv="Content-Type" content="text/html; charset=UTF-16">
Ну с этим ладно. Лишний мета удалил, текст в UTF-8 конвертнул с помощью UTF8Encode. Но вот дальше проблему решить не смог.
2. Еще в XSL есть вот такой кусочек
- Код: Выделить всё
- <center>
 <xsl:variable name="srcImg1" select="data/GraphMx/NameImg"/>
 <img src="{$srcImg1}" alt="График Nz - Mx" align="center" border="0" vspace="4" hspace="4"/>
 </center>
В который подставляется из XML вот это
- Код: Выделить всё
- <NameImg>D:KO206WWORKплита вдоль пролет D20_Add_Armплита вдоль пролет D20_Add_Arm_Chart1.jpg</NameImg>
Вот тут очередные грабли. Получаю после трансформации вот такую хрень, которую браузер не понимает
- Код: Выделить всё
- <center>
 <img src="D:KO206WWORK%D0%BF%D0%BB%D0%B8%D1%82%D0%B0 %D0%B2%D0%B4%D0%BE%D0%BB%D1%8C %D0%BF%D1%80%D0%BE%D0%BB%D0%B5%D1%82 D20_Add_Arm%D0%BF%D0%BB%D0%B8%D1%82%D0%B0 %D0%B2%D0%B4%D0%BE%D0%BB%D1%8C %D0%BF%D1%80%D0%BE%D0%BB%D0%B5%D1%82 D20_Add_Arm_Chart1.jpg" alt="График Nz - Mx" align="center" border="0" vspace="4" hspace="4"></center>
Все другие преобразования где используются теги типа
- Код: Выделить всё
- <xsl:value-of select="data/FileSource"/>
для которых информация в XML русскими буквами преобразуется нормально, а вот через создание переменной вот такая шняга.
Причем, попытки отобразить страницу в кодировках win-1251 или UTF-16 не помогаю.
Текст функции конвертации вот такой
- Код: Выделить всё
- function ApplyStylesheet(const XMLFile, XSLFile: String): WideString;
 var
 XML, XSL, fName: Variant;
 Html: WideString;
 begin
 Html := '';
 XML := CreateOleObject('MSXML.DOMDocument');
 XML.ValidateOnParse := True;
 XML.Async := False;
 XSL := CreateOleObject('MSXML.DOMDocument');
 XSL.ValidateOnParse := True;
 XSL.Async := False;
 try
 fName := XMLFile;
 XML.load( fName );
 except
 on E: EOleException do
 MessageDlg('Загрузка XML', 'Ошибка чтения файла'#13+UTF8Encode(E.Message), mtError, [mbClose], 0);
 end;
 try
 fName := XSLFile;
 XSL.load( fName );
 except
 on E: EOleException do
 MessageDlg('Загрузка XSL', 'Ошибка чтения файла'#13+UTF8Encode(E.Message), mtError, [mbClose], 0);
 end;
 try
 Html := XML.transformNode(XSL);
 except
 on E: EOleException do
 MessageDlg('XSLT преобразование', 'Ошибка преобразования'#13+ UTF8Encode(E.Message), mtError, [mbClose], 0);
 end;
 Result := Html;
 end;
Люди добрые! Кто с XSLT преобразованиями под винду работал! ПАМАЖИТЕ!!!!
Добавлено спустя 1 час 6 минут 20 секунд:
В виде временного костыля сделал перекодировку шняги D:\KO206W\WORK\%D0%BF%D0%BB%D0%B8%D1%82%D0%B0... в нормальный вид. Вот еще предстоит проверить как это работает на других виндах. В частности и на семерке...





