我使用这个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
谷歌搜索时我发现了这个:
如果函数是用户定义的函数,则转换的参数值绑定到 函数的形式参数和函数体被评估。返回的值 然后通过应用函数体将函数体转换为函数的声明返回类型 功能转换规则。
函数不会从中继承焦点(上下文项,上下文位置和上下文大小) 函数调用的环境。在评估函数体时,焦点未定义, 除非它是由函数体内部的某个表达式的动作定义的。使用一个 当焦点未定义时,取决于焦点的表达式会导致动态错误。
但我不确定我理解。这个问题真的出现在我的样式表中吗?
答案 0 :(得分:0)
问题来自传递给焦点的缓冲区,显然它是在模式验证后静默关闭的。我添加了一个额外的“开放”
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);
}
}