Russian Qt Forum
Ноябрь 23, 2024, 03:56 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Обработка XSLT и QAbstractMessageHandler  (Прочитано 3450 раз)
lvv83
Гость
« : Декабрь 11, 2009, 19:00 »

Здравствуйте.
Есть задача преобразовать XML-документ при помощи XSLT-файла.
Насколько я понимаю, в Qt отсутствует поддержка XSLT 1.0

Код:
void MainWindow::CreateReport(const QString& sourceFilename, const QString& destFilename, const QString& transformFilename)
{
    QXmlQuery query (QXmlQuery::XSLT20);

    QFile inputFile (sourceFilename);  // исходный XML
    QFile outputFile (destFilename);   // конечный XML
    QFile transformFile (transformFilename); // путь к XSLT-шаблону

    bool i = inputFile.open(QIODevice::ReadOnly);
    bool o = outputFile.open(QIODevice::WriteOnly);
    bool t = transformFile.open(QIODevice::ReadOnly);

    if (i && o && t == 1)
    {
        query.setFocus(&inputFile);
        query.setQuery(&transformFile);

        // query.isValid() выдает False

        // файл получается пустым
        query.evaluateTo(&outputFile);
    }

    inputFile.close();
    outputFile.close();
    transformFile.close();
}

XSLT-шаблон имеет версию 1.0
Код
XML
<xsl:stylesheet version="1.0"
               xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output method="xml" indent="no"  />
</xsl:stylesheet>
 

После правки номера версии на version="2.0" ничего не изменилось. Что я делаю не так в коде или нужно преобразовать шаблон?

Попробовал воспользоваться механизмом messageHandler-ов для отлова сообщений от метода evaluateTo

Файл mуmessagehandler.h
Код:
#ifndef MYMESSAGEHANDLER_H
#define MYMESSAGEHANDLER_H

#include <QtXmlPatterns>

class MyMessageHandler: public QAbstractMessageHandler
{

protected:
    void handleMessage(QtMsgType type,
                       const QString &description,
                       const QUrl &identifier,
                       const QSourceLocation &sourceLocation);
    
public:
    MyMessageHandler();
};

#endif // MYMESSAGEHANDLER_H

Файл mуmessagehandler.cpp
Код:
#include "mymessagehandler.h"

MyMessageHandler::MyMessageHandler()
{
}

void MyMessageHandler::handleMessage(QtMsgType type,
                       const QString &description,
                       const QUrl &identifier,
                       const QSourceLocation &sourceLocation)
{
    qDebug() << description;
}

Теперь пытаемся установить messaheHandler
Код:
void MainWindow::CreateReport(const QString& sourceFilename, const QString& destFilename)
{
    QXmlQuery query (QXmlQuery::XSLT20);
    MyMessageHandler handler;

    // Ошибка при компиляции
    // no matching function for call to `QXmlQuery::setMessageHandler(MyMessageHandler&)'
    query.setMessageHandler(handler);

    // ...
}

Буду признателен за помощь.

PS: Вопрос с handler-ом снят. Забыл указать знак амперсанда. Получил сообщение
"<html xmlns='http://www.w3.org/1999/xhtml/'><body><p>syntax error, unexpected unknown keyword, expecting )</p></body></html>"
Вопрос по XSLT остается открытым.

« Последнее редактирование: Декабрь 11, 2009, 19:07 от lvv83 » Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.054 секунд. Запросов: 20.