Пользовался 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... в нормальный вид. Вот еще предстоит проверить как это работает на других виндах. В частности и на семерке...