XSLT преобразование средствами MSXML

Вопросы использования сторонних (не входящих в состав FPC и Lazarus) утилит и библиотек.

Модератор: Модераторы

XSLT преобразование средствами MSXML

Сообщение vada » 12.10.2012 10:59:30

Всем добрый день!
Пользовался 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... в нормальный вид. Вот еще предстоит проверить как это работает на других виндах. В частности и на семерке...
Аватара пользователя
vada
энтузиаст
 
Сообщения: 691
Зарегистрирован: 14.02.2006 13:43:17

Re: XSLT преобразование средствами MSXML

Сообщение Brainenjii » 12.10.2012 12:24:06

не знаю, что такое MSXML, но я для xslt преобразования пользовался сторонними утилитами, для винды даже сборочку сделал - http://rusfolder.com/30932894 ^_^
Примерный пример использования - viewtopic.php?f=24&t=7297&start=120#p62680
Аватара пользователя
Brainenjii
энтузиаст
 
Сообщения: 1351
Зарегистрирован: 10.05.2007 00:04:46

Re: XSLT преобразование средствами MSXML

Сообщение vada » 12.10.2012 12:36:32

MSXML это библиотека для работы с XML XSLT в винде. Она базовая и в винде есть всегда. Цитата из книги "Технология XSLT" Алексей Валиков:
Основные характеристики:
Платформы: MS Windows.
Расширения: функции расширения на JavaScript и VBScript.
Полнота реализации: один из наиболее проработанных процессоров.
Разработчик: Microsoft Corporation.
URL: http://msdn.microsoft.com/xml.

Вашу сборочку посмотрю.
Спасибо!

Добавлено спустя 40 минут 9 секунд:
А можно файл куда-нибудь еще раз выложить?
Срок хранения файла истек.

Добавлено спустя 8 минут 18 секунд:
Чётакак наворочено! :(

Добавлено спустя 1 минуту 56 секунд:
Кстати, под семеркой моя прога тож работает. Так что... Оставлю пока с костылями. Делает то что мне надо, дальше может найду инфу и допилю до приемлемого уровня.
Аватара пользователя
vada
энтузиаст
 
Сообщения: 691
Зарегистрирован: 14.02.2006 13:43:17


Вернуться в Сторонние средства

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 8

Рейтинг@Mail.ru