Ошибка: "фокус не определен"
Я использую этот xslt (FpML является корнем моего документа):
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<xsl:sequence select="/FpML"/>
</xsl:template>
</xsl:stylesheet>
в этом коде:
if(schema.isValid())
{
QXmlSchemaValidator validator(schema);
QByteArray data(this->xmlTextEdit->toPlainText().toStdString().c_str());
QBuffer buffer(&data);
buffer.open(QIODevice::ReadOnly);
if (validator.validate(&buffer))
qDebug() << "instance document is valid";
else
qDebug() << "instance document is invalid";
QXmlQuery query(QXmlQuery::XSLT20);
query.setFocus(&buffer);
qDebug() << QDir::current();
QUrl XSLT("test__.xslt");
if( XSLT.isValid())
{
query.setQuery(XSLT);
QString result;
query.evaluateTo(&result);
this->xslTextEdit->setPlainText(result);
}
}
И я получил эту ошибку:
at line 10, column 18: The focus is undefined
При поиске в Google я нашел это:
Если функция является пользовательской функцией, преобразованные значения аргумента привязываются к формальным параметрам функции, и тело функции оценивается. Значение, возвращаемое телом функции, затем преобразуется в объявленный тип возврата функции, применяя правила преобразования функции.
Функция не наследует фокус (элемент контекста, положение контекста и размер контекста) из среды вызова функции. Во время оценки тела функции фокус не определен, кроме случаев, когда он определяется действием некоторого выражения внутри тела функции. Использование выражения, которое зависит от фокуса, когда фокус не определен, приводит к динамической ошибке.
Но я не уверен, что понимаю. Проблема действительно в моей таблице стилей?
1 ответ
Проблема возникла из-за того, что буфер был передан в фокус, после чего он был тихо остановлен после проверки схемы. Я добавил дополнительный "открытый"
if(schema.isValid())
{
QXmlSchemaValidator validator(schema);
QByteArray data(this->xmlTextEdit->toPlainText().toStdString().c_str());
QBuffer buffer(&data);
buffer.open(QIODevice::ReadOnly);
if (validator.validate(&buffer))
qDebug() << "instance document is valid";
else
qDebug() << "instance document is invalid";
QXmlQuery query(QXmlQuery::XSLT20);
qDebug() << QDir::current();
QUrl XSLT("test__.xslt");
if( XSLT.isValid())
{
buffer.open(QIODevice::ReadOnly);
query.setFocus(&buffer);
query.setQuery(XSLT);
QString result;
query.evaluateTo(&result);
this->xslTextEdit->setPlainText(result);
}
}