Здравствуйте.
Есть задача преобразовать 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 остается открытым.