[Interest] Restricting QXmlQuery to QPath 2.0
Elvis Stansvik
elvstone at gmail.com
Sat Oct 18 14:39:56 CEST 2014
2014-10-18 14:03 GMT+02:00 Elvis Stansvik <elvstone at gmail.com>:
> Hi folks,
>
> I'm considering using QtXmlPatterns, but I need to be able to restrict
> queries to only accept XPath 2.0 expressions, not the full XQuery 1.0
> language.
>
> This seems impossible at the moment; QXmlQuery supports either XQuery10 or
> XSLT20 as values for queryLanguage. However, the QueryLanguage enum has a
> hidden value XPath20 for internal purposes. I took a quick look, and this
> seems to be used internally when parsing of XPath 2.0 expressions in XSLT
> 2.0.
>
> I'm hoping someone intimately familiar with the query code can answer:
> Would it be possible/feasible to add third public mode to the query parser,
> one in which only XPath 2.0 is accepted? Or is this too much work / out of
> scope?
>
> I haven't looked too closely at the code, but XPath 2.0 is a subset of
> XQuery 1.0, so my hope is that it would not be an insurmountable effort to
> add this. But I may be wrong. Also, I suspect QtXmlPatterns might not be
> actively worked on except for bugfixing?
>
After some experimentation, I've found that it's perfectly possible to pass
the (internal) QXmlQuery::XPath20 value as queryLanguage.
E.g
QXmlQuery query;
query.setQuery("declare variable $foo external;
doc('index.html')/html/body/p[1]");
will work (default language is XQuery, so the variable declaration is OK),
and so will
QXmlQuery query(QXmlQuery::XPath20); // Internal value!
query.setQuery("doc('index.html')/html/body/p[1]");
since it is valid XPath 2.0 (I removed the variable declaration). And lastly
QXmlQuery query(QXmlQuery::XPath20); // Internal value!
query.setQuery("declare variable $foo external;
doc('index.html')/html/body/p[1]");
will barf as expected (I added the variable declaration back in):
Error XPST0003 in file:///home/estan/test/test, at line 1, column 1: A
construct was encountered which is disallowed in the current language(XPath
2.0).
since variable declarations are not allowed in XPath 2.0.
So from a quick look, it seems that it will Just Work (tm). That said, it's
of course relying on internal behavior.
My question is now: Anyone familiar enough with the code to know if this is
"safe"? Will this just work? If so, could we consider making the
QXmlQuery::XPath20 QueryLanguage value public API?
Regards,
Elvis
> Cheers,
> Elvis
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.qt-project.org/pipermail/interest/attachments/20141018/c5a6607e/attachment.html>
More information about the Interest
mailing list