diff options
author | Jerome Pasion <jerome.pasion@digia.com> | 2012-11-22 16:35:24 +0100 |
---|---|---|
committer | The Qt Project <gerrit-noreply@qt-project.org> | 2012-11-23 13:16:20 +0100 |
commit | 051aeb291646745559c47da160193bdcbd34ef2b (patch) | |
tree | 50040152b4dfe22238ef0446c9e57ff1b345bdd4 /doc/src/xml-processing/xml-patterns.qdoc | |
parent | b34af22fcc7e9321e5a7943763cd68a1d51a36d5 (diff) | |
download | qtxmlpatterns-051aeb291646745559c47da160193bdcbd34ef2b.tar.gz |
Doc: Modularized Qt XML Patterns documentation.
-moved snippets, images, documentation to src/xmlpatterns
-fixed \snippet tag
-ported module information from qtdoc repository
-enabled "make docs" for the module
-set up qdocconf file and .index file
-updated tests/auto/patternistexamples to point to the new
snippet locations
Change-Id: Ifd10733c277c6dbacac42898c8e7bacd00d23f27
Reviewed-by: Lars Knoll <lars.knoll@digia.com>
Diffstat (limited to 'doc/src/xml-processing/xml-patterns.qdoc')
-rw-r--r-- | doc/src/xml-processing/xml-patterns.qdoc | 889 |
1 files changed, 0 insertions, 889 deletions
diff --git a/doc/src/xml-processing/xml-patterns.qdoc b/doc/src/xml-processing/xml-patterns.qdoc deleted file mode 100644 index 1aab9b7..0000000 --- a/doc/src/xml-processing/xml-patterns.qdoc +++ /dev/null @@ -1,889 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2012 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal -** -** This file is part of the documentation of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:FDL$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. -** -** GNU Free Documentation License Usage -** Alternatively, this file may be used under the terms of the GNU Free -** Documentation License version 1.3 as published by the Free Software -** Foundation and appearing in the file included in the packaging of -** this file. Please review the following information to ensure -** the GNU Free Documentation License version 1.3 requirements -** will be met: http://www.gnu.org/copyleft/fdl.html. -** $QT_END_LICENSE$ -** -****************************************************************************/ - -/*! - \page xmlprocessing.html - \title XQuery - - \previouspage Working with the DOM Tree - \contentspage XML Processing - - \keyword Patternist - - \brief An overview of Qt's support for using XML technologies in - Qt programs. - - \tableofcontents - - \section1 Introduction - - XQuery is a language for traversing XML documents to select and - aggregate items of interest and to transform them for output as - XML or some other format. XPath is the \e{element selection} part - of XQuery. - - The Qt XML Patterns module supports using - \l{http://www.w3.org/TR/xquery} {XQuery 1.0} and - \l{http://www.w3.org/TR/xpath20} {XPath 2.0} in Qt applications, - for querying XML data \e{and} for querying - \l{QAbstractXmlNodeModel} {non-XML data that can be modeled to - look like XML}. - Readers who are not familiar with the XQuery/XPath language can read - \l {A Short Path to XQuery} for a brief introduction. - - \section1 Advantages of using Qt XML Patterns and XQuery - - The XQuery/XPath language simplifies data searching and - transformation tasks by eliminating the need for doing a lot of - C++ or Java procedural programming for each new query task. Here - is an XQuery that constructs a bibliography of the contents of a - library: - - \target qtxmlpatterns_example_query - \quotefile patternist/introductionExample.xq - - First, the query opens a \c{<bibliography>} element in the - output. The - \l{xquery-introduction.html#using-path-expressions-to-match-and-select-items} - {embedded path expression} then loads the XML document describing - the contents of the library (\c{library.xml}) and begins the - search. For each \c{<book>} element it finds, where the publisher - was Addison-Wesley and the publication year was after 1991, it - creates a new \c{<book>} element in the output as a child of the - open \c{<bibliography>} element. Each new \c{<book>} element gets - the book's title as its contents and the book's publication year - as an attribute. Finally, the \c{<bibliography>} element is - closed. - - The advantages of using Qt XML Patterns and XQuery in your Qt - programs are summarized as follows: - - \list - - \li \b{Ease of development}: All the C++ programming required to - perform data query tasks can be replaced by a simple XQuery - like the example above. - - \li \b{Comprehensive functionality}: The - \l{http://www.w3.org/TR/xquery/#id-expressions} {expression - syntax} and rich set of - \l{http://www.w3.org/TR/xpath-functions} {functions and - operators} provided by XQuery are sufficient for performing any - data searching, selecting, and sorting tasks. - - \li \b{Conformance to standards}: Conformance to all applicable - XML and XQuery standards ensures that Qt XML Patterns can always - process XML documents generated by other conformant - applications, and that XML documents created with Qt XML Patterns - can be processed by other conformant applications. - - \li \b{Maximal flexibility} The Qt XML Patterns module can be used - to query XML data \e{and} non-XML data that can be - \l{QAbstractXmlNodeModel} {modeled to look like XML}. - - \endlist - - \section1 Using the Qt XML Patterns module - - There are two ways Qt XML Patterns can be used to evaluate queries. - You can run the query engine in your Qt application using the - Qt XML Patterns C++ API, or you can run the query engine from the - command line using Qt's \c{xmlpatterns} command line utility. - - \section2 Running the query engine from your Qt application - - If we save the example XQuery shown above in a text file (e.g. - \c{myquery.xq}), we can run it from a Qt application using a - standard Qt XML Patterns code sequence: - - \snippet code/src_xmlpatterns_api_qxmlquery.cpp 3 - - First construct a QFile for the text file containing the XQuery - (\c{myquery.xq}). Then create an instance of QXmlQuery and call - its \l{QXmlQuery::}{setQuery()} function to load and parse the - XQuery file. Then create an \l{QXmlSerializer} {XML serializer} to - output the query's result set as unformatted XML. Finally, call - the \l{QXmlQuery::}{evaluateTo()} function to evaluate the query - and serialize the results as XML. - - \note If you compile Qt yourself, the Qt XML Patterns module will - \e{not} be built if exceptions are disabled, or if you compile Qt - with a compiler that doesn't support member templates, e.g., MSVC - 6. - - See the QXmlQuery documentation for more information about the - Qt XML Patterns C++ API. - - \section2 Running the query engine from the command line utility - - \e xmlpatterns is a command line utility for running XQueries. It - expects the name of a file containing the XQuery text. - - \snippet code/doc_src_qtxmlpatterns.qdoc 2 - - The XQuery in \c{myQuery.xq} will be evaluated and its output - written to \c stdout. Pass the \c -help switch to get the list of - input flags and their meanings. - - xmlpatterns can be used in scripting. However, the descriptions - and messages it outputs were not meant to be parsed and may be - changed in future releases of Qt. - - \target QtXDM - \section1 The XQuery Data Model - - XQuery represents data items as \e{atomic values} or \e{nodes}. An - atomic value is a value in the domain of one of the - \l{http://www.w3.org/TR/xmlschema-2/#built-in-datatypes} {built-in - datatypes} defined in \l{http://www.w3.org/TR/xmlschema-2} {Part - 2} of the W3C XML Schema. A node is normally an XML element or - attribute, but when non-XML data is \l{QAbstractXmlNodeModel} - {modeled to look like XML}, a node can also represent a non-XML - data items. - - When you run an XQuery using the C++ API in a Qt application, you - will often want to bind program variables to $variables in the - XQuery. After the query is evaluated, you will want to interpret - the sequence of data items in the result set. - - \section2 Binding program variables to XQuery variables - - When you want to run a parameterized XQuery from your Qt - application, you will need to \l{QXmlQuery::bindVariable()} {bind - variables} in your program to $name variables in your XQuery. - - Suppose you want to parameterize the bibliography XQuery in the - example above. You could define variables for the catalog that - contains the library (\c{$file}), the publisher name - (\c{$publisher}), and the year of publication (\c{$year}): - - \target qtxmlpatterns_example_query2 - \quotefile patternist/introExample2.xq - - Modify the Qt XML Patterns code to use one of the \l{QXmlQuery::} - {bindVariable()} functions to bind a program variable to each - XQuery $variable: - - \snippet code/src_xmlpatterns_api_qxmlquery.cpp 4 - - Each program variable is passed to Qt XML Patterns as a QVariant of - the type of the C++ variable or constant from which it is - constructed. Note that Qt XML Patterns assumes that the type of the - QVariant in the bindVariable() call is the correct type, so the - $variable it is bound to must be used in the XQuery accordingly. - The following table shows how QVariant types are mapped to XQuery - $variable types: - - \table - - \header - \li QVariant type - \li XQuery $variable type - - \row - \li QVariant::LongLong - \li \c xs:integer - - \row - \li QVariant::Int - \li \c xs:integer - - \row - \li QVariant::UInt - \li \c xs:nonNegativeInteger - - \row - \li QVariant::ULongLong - \li \c xs:unsignedLong - - \row - \li QVariant::String - \li \c xs:string - - \row - \li QVariant::Double - \li \c xs:double - - \row - \li QVariant::Bool - \li \c xs:boolean - - \row - \li QVariant::Double - \li \c xs:decimal - - \row - \li QVariant::ByteArray - \li \c xs:base64Binary - - \row - \li QVariant::StringList - \li \c xs:string* - - \row - \li QVariant::Url - \li \c xs:string - - \row - \li QVariant::Date - \li \c xs:date. - - \row - \li QVariant::DateTime - \li \c xs:dateTime - - \row - \li QVariant::Time. - \li \c xs:time. (see \l{Binding To Time}{Binding To - QVariant::Time} below) - - \row - \li QVariantList - \li (see \l{Binding To QVariantList}{Binding To QVariantList} - below) - - \endtable - - A type not shown in the table is not supported and will cause - undefined XQuery behavior or a $variable binding error, depending - on the context in the XQuery where the variable is used. - - \target Binding To Time - \section3 Binding To QVariant::Time - - Because the instance of QTime used in QVariant::Time does not - include a zone offset, an instance of QVariant::Time should not be - bound to an XQuery variable of type \c xs:time, unless the QTime is - UTC. When binding a non-UTC QTime to an XQuery variable, it should - first be passed as a string, or converted to a QDateTime with an arbitrary - date, and then bound to an XQuery variable of type \c xs:dateTime. - - \target Binding To QVariantList - \section3 Binding To QVariantList - - A QVariantList can be bound to an XQuery $variable. All the - \l{QVariant}s in the list must be of the same atomic type, and the - $variable the variant list is bound to must be of that same atomic - type. If the QVariants in the list are not all of the same atomic - type, the XQuery behavior is undefined. - - \section2 Interpreting XQuery results - - When the results of an XQuery are returned in a sequence of \l - {QXmlResultItems} {result items}, atomic values in the sequence - are treated as instances of QVariant. Suppose that instead of - serializing the results of the XQuery as XML, we process the - results programatically. Modify the standard Qt XML Patterns code - sequence to call the overload of QXmlQuery::evaluateTo() that - populates a sequence of \l {QXmlResultItems} {result items} with - the XQuery results: - - \snippet code/src_xmlpatterns_api_qxmlquery.cpp 5 - - Iterate through the \l {QXmlResultItems} {result items} and test - each QXmlItem to see if it is an atomic value or a node. If it is - an atomic value, convert it to a QVariant with \l {QXmlItem::} - {toAtomicValue()} and switch on its \l {QVariant::type()} {variant - type} to handle all the atomic values your XQuery might return. - The following table shows the QVariant type to expect for each - atomic value type (or QXmlName): - - \table - - \header - \li XQuery result item type - \li QVariant type returned - - \row - \li \c xs:QName - \li QXmlName (see \l{Handling QXmlNames}{Handling QXmlNames} - below) - - \row - \li \c xs:integer - \li QVariant::LongLong - - \row - \li \c xs:string - \li QVariant::String - - \row - \li \c xs:string* - \li QVariant::StringList - - \row - \li \c xs:double - \li QVariant::Double - - \row - \li \c xs:float - \li QVariant::Double - - \row - \li \c xs:boolean - \li QVariant::Bool - - \row - \li \c xs:decimal - \li QVariant::Double - - \row - \li \c xs:hexBinary - \li QVariant::ByteArray - - \row - \li \c xs:base64Binary - \li QVariant::ByteArray - - \row - \li \c xs:gYear - \li QVariant::DateTime - - \row - \li \c xs:gYearMonth - \li QVariant::DateTime - - \row - \li \c xs:gMonthDay - \li QVariant::DateTime - - \row - \li \c xs:gDay - \li QVariant::DateTime - - \row - \li \c xs:gMonth - \li QVariant::DateTime - - \row - \li \c xs:anyURI - \li QVariant::Url - - \row - \li \c xs:untypedAtomic - \li QVariant::String - - \row - \li \c xs:ENTITY - \li QVariant::String - - \row - \li \c xs:date - \li QVariant::DateTime - - \row - \li \c xs:dateTime - \li QVariant::DateTime - - \row - \li \c xs:time - \li (see \l{xstime-not-mapped}{No mapping for xs:time} below) - - \endtable - - \target Handling QXmlNames - \section3 Handling QXmlNames - - If your XQuery can return atomic value items of type \c{xs:QName}, - they will appear in your QXmlResultItems as instances of QXmlName. - Since the QVariant class does not support the QXmlName class - directly, extracting them from QXmlResultItems requires a bit of - slight-of-hand using the \l{QMetaType} {Qt metatype system}. We - must modify our example to use a couple of template functions, a - friend of QMetaType (qMetaTypeId<T>()) and a friend of QVariant - (qvariant_cast<T>()): - - \snippet code/src_xmlpatterns_api_qxmlquery.cpp 6 - - To access the strings in a QXmlName returned by an - \l{QXmlQuery::evaluateTo()} {XQuery evaluation}, the QXmlName must - be accessed with the \l{QXmlNamePool} {name pool} from the - instance of QXmlQuery that was used for the evaluation. - - \target xstime-not-mapped - \section3 No mapping for xs:time - - An instance of \c xs:time can't be represented correctly as an - instance of QVariant::Time, unless the \c xs:time is a UTC time. - This is because xs:time has a zone offset (0 for UTC) in addition - to the time value, which the QTime in QVariant::Time does not - have. This means that if an XQuery tries to return an atomic value - of type \c xs:time, an invalid QVariant will be returned. A query - can return an atomic value of type xs:time by either converting it - to an \c xs:dateTime with an arbitrary date, or to an \c xs:string. - - \section1 Using XQuery with Non-XML Data - - Although the XQuery language was designed for querying XML, with - Qt XML Patterns one can use XQuery for querying any data that can - be modeled to look like XML. Non-XML data is modeled to look like - XML by loading it into a custom subclass of QAbstractXmlNodeModel, - where it is then presented to the Qt XML Patterns XQuery engine via - the same API the XQuery engine uses for querying XML. - - When Qt XML Patterns loads and queries XML files and produces XML - output, it can always load the XML data into its default XML node - model, where it can be traversed efficiently. The XQuery below - traverses the product orders found in the XML file \e myOrders.xml - to find all the skin care product orders and output them ordered - by shipping date. - - \quotefile patternist/introAcneRemover.xq - - Qt XML Patterns can be used out of the box to perform this - query, provided \e myOrders.xml actually contains well-formed XML. It - can be loaded directly into the default XML node model and - traversed. But suppose we want Qt XML Patterns to perform queries on - the hierarchical structure of the local file system. The default - XML node model in Qt XML Patterns is not suitable for navigating the - file system, because there is no XML file to load that contains a - description of it. Such an XML file, if it existed, might look - something like this: - - \quotefile patternist/introFileHierarchy.xml - - The \l{File System Example}{File System Example} does exactly this. - - There is no such file to load into the default XML node model, but - one can write a subclass of QAbstractXmlNodeModel to represent the - file system. This custom XML node model, once populated with all - the directory and file descriptors obtained directly from the - system, presents the complete file system hierarchy to the query - engine via the same API used by the default XML node model to - present the contents of an XML file. In other words, once the - custom XML node model is populated, it presents the file system to - the query engine as if a description of it had been loaded into - the default XML node model from an XML file like the one shown - above. - - Now we can write an XQuery to find all the XML files and parse - them to find the ones that don't contain well-formed XML. - - \quotefromfile patternist/introNavigateFS.xq - \skipto <html> - \printuntil - - Without Qt XML Patterns, there is no simple way to solve this kind - of problem. You might do it by writing a C++ program to traverse - the file system, sniff out all the XML files, and submit each one - to an XML parser to test that it contains valid XML. The C++ code - required to write that program will probably be more complex than - the C++ code required to subclass QAbstractXmlNodeModel, but even - if the two are comparable, your custom C++ program can be used - only for that one task, while your custom XML node model can be - used by any XQuery that must navigate the file system. - - The general approach to using XQuery to perform queries on non-XML - data has been a three step process. In the first step, the data is - loaded into a non-XML data model. In the second step, the non-XML - data model is serialized as XML and output to XML (text) files. In - the final step, an XML tool loads the XML files into a second, XML - data model, where the XQueries can be performed. The development - cost of implementing this process is often high, and the three - step system that results is inefficient because the two data - models must be built and maintained separately. - - With Qt XML Patterns, subclassing QAbstractXmlNodeModel eliminates - the transformation required to convert the non-XML data model to - the XML data model, because there is only ever one data model - required. The non-XML data model presents the non-XML data to the - query engine via the XML data model API. Also, since the query - engine uses the API to access the QAbstractXmlNodeModel, the data - model subclass can construct the elements, attributes and other - data on demand, responding to the query's specific requests. This - can greatly improve efficiency, because it means the entire model - might not have to be built. For example, in the file system model - above, it is not necessary to build an instance for a whole - XML file representing the whole file system. Instead nodes are - created on demand, which also likely is a small subset of the file - system. - - Examples of other places where XQuery could be used in - Qt XML Patterns to query non-XML data: - - \list - - \li The internal representation for word processor documents - - \li The set of dependencies for a software build system - - \li The hierarchy (or graph) that links a set of HTML documents - from a web crawler - - \li The images and meta-data in an image collection - - \li The set of D-Bus interfaces available in a system - - \li A QObject hierarchy, as seen in the \l{QObject XML Model - Example} {QObject XML Model example}. - - \endlist - - See the QAbstractXmlNodeModel documentation for information about - how to implement custom XML node models. - - \section1 More on using Qt XML Patterns with non-XML Data - - Subclassing QAbstractXmlNodeModel to let the query engine access - non-XML data by the same API it uses for XML is the feature that - enables Qt XML Patterns to query non-XML data with XQuery. It allows - XQuery to be used as a mapping layer between different non-XML - node models or between a non-XML node model and the built-in XML - node model. Once the subclass(es) of QAbstractXmlNodeModel have - been written, XQuery can be used to select a set of elements from - one node model, transform the selected elements, and then write - them out, either as XML using QXmlQuery::evaluateTo() and QXmlSerializer, - or as some other format using a subclass of QAbstractXmlReceiver. - - Consider a word processor application that must import and export - data in several different formats. Rather than writing a lot of - C++ code to convert each input format to an intermediate form, and - more C++ code to convert the intermediate form back to each - output format, one can implement a solution based on Qt XML Patterns - that uses simple XQueries to transform each XML or non-XML format - (e.g. MathFormula.xml below) to the intermediate form (e.g. the - DocumentRepresentation node model class below), and more simple - XQueries to transform the intermediate form back to each XML or - non-XML format. - - \image patternist-wordProcessor.png - - Because CSV files are not XML, a subclass of QAbstractXmlNodeModel - is used to present the CSV data to the XQuery engine as if it were - XML. What are not shown are the subclasses of QAbstractXmlReceiver - that would then send the selected elements into the - DocumentRepresentation node model, and the subclasses of - QAbstractXmlNodeModel that would ultimately write the output files - in each format. - - \section1 Security Considerations - - \section2 Code Injection - - XQuery is vulnerable to - \l{http://en.wikipedia.org/wiki/Code_injection} {code injection - attacks} in the same way as the SQL language. If an XQuery is - constructed by concatenating strings, and the strings come from - user input, the constructed XQuery could be malevolent. The best - way to prevent code injection attacks is to not construct XQueries - from user-written strings, but only accept user data input using - QVariant and variable bindings. See QXmlQuery::bindVariable(). - - The articles - \l{http://www.ibm.com/developerworks/xml/library/x-xpathinjection.html} - {Avoid the dangers of XPath injection}, by Robi Sen and - \l{http://www.packetstormsecurity.org/papers/bypass/Blind_XPath_Injection_20040518.pdf} - {Blind XPath Injection}, by Amit Klein, discuss the XQuery code - injection problem in more detail. - - \section2 Denial of Service Attacks - - Applications using Qt XML Patterns are subject to the same - limitations of software as other systems. Generally, these can not - be checked. This means Qt XML Patterns does not prevent rogue - queries from consuming too many resources. For example, a query - could take too much time to execute or try to transfer too much - data. A query could also do too much recursion, which could crash - the system. XQueries can do these things accidentally, but they - can also be done as deliberate denial of service attacks. - - \section1 Features and Conformance - - \section2 XQuery 1.0 - - Qt XML Patterns aims at being a - \l{http://www.w3.org/TR/xquery/#id-xquery-conformance} {conformant - XQuery processor}. It adheres to - \l{http://www.w3.org/TR/xquery/#id-minimal-conformance} {Minimal - Conformance} and supports the - \l{http://www.w3.org/TR/xquery/#id-serialization-feature} - {Serialization Feature} and the - \l{http://www.w3.org/TR/xquery/#id-full-axis-feature} {Full Axis - Feature}. Qt XML Patterns currently passes 97% of the tests in the - \l{http://www.w3.org/XML/Query/test-suite} {XML Query Test Suite}. - Areas where conformance may be questionable and where behavior may - be changed in future releases include: - - \list - - \li Some corner cases involving namespaces and element constructors - are incorrect. - - \li XPath is a subset of XQuery and the implementation of - Qt XML Patterns uses XPath 2.0 with XQuery 1.0. - - \endlist - - The specifications discusses conformance further: - \l{http://www.w3.org/TR/xquery/}{XQuery 1.0: An XML Query - Language}. W3C's XQuery testing effort can be of interest as - well, \l{http://www.w3.org/XML/Query/test-suite/}{XML Query Test - Suite}. - - Currently \c fn:collection() does not access any data set, and - there is no API for providing data through the collection. As a - result, evaluating \c fn:collection() returns the empty - sequence. We intend to provide functionality for this in a future - release of Qt. - - Only queries encoded in UTF-8 are supported. - - \section2 XSLT 2.0 - - Partial support for XSLT was introduced in Qt 4.5. Future - releases of Qt XML Patterns will aim to support these XSLT - features: - - \list - \li Basic XSLT 2.0 processor - \li Serialization feature - \li Backwards Compatibility feature - \endlist - - For details, see \l{http://www.w3.org/TR/xslt20/#conformance}{XSL - Transformations (XSLT) Version 2.0, 21 Conformance}. - - \note In this release, XSLT support is considered experimental. - - Unsupported or partially supported XSLT features are documented - in the following table. The implementation of XSLT in Qt 4.5 can - be seen as XSLT 1.0 but with the data model of XPath 2.0 and - XSLT 2.0, and using the using the functionality of XPath 2.0 and - its accompanying function library. When Qt XML Patterns encounters - an unsupported or partially support feature, it will either report - a syntax error or silently continue, unless otherwise noted in the - table. - - The implementation currently passes 42% of W3C's XSLT test suite, - which focus on features introduced in XSLT 2.0. - - \table - \header - \li XSL Feature - \li Support Status - \row - \li \c xsl:key and \c fn:key() - \li not supported - \row - \li \c xsl:include - \li not supported - \row - \li \c xsl:import - \li not supported - \row - \li \c xsl:copy - - \li The \c copy-namespaces and \c inherit-namespaces attributes - have no effect. For copied comments, attributes and - processing instructions, the copy has the same node - identity as the original. - - \row - \li \c xsl:copy-of - \li The \c copy-namespaces attribute has no effect. - \row - \li \c fn:format-number() - \li not supported - \row - \li \c xsl:message - \li not supported - \row - \li \c xsl:use-when - \li not supported - \row - \li \c Tunnel Parameters - \li not supported - \row - \li \c xsl:attribute-set - \li not supported - \row - \li \c xsl:decimal-format - \li not supported - \row - \li \c xsl:fallback - \li not supported - \row - \li \c xsl:apply-imports - \li not supported - \row - \li \c xsl:character-map - \li not supported - \row - \li \c xsl:number - \li not supported - \row - \li \c xsl:namespace-alias - \li not supported - \row - \li \c xsl:output - \li not supported - \row - \li \c xsl:output-character - \li not supported - \row - \li \c xsl:preserve-space - \li not supported - \row - \li \c xsl:result-document - \li not supported - \row - \li Patterns - \li Complex patterns or patterns with predicates have issues. - \row - \li \c 2.0 Compatibility Mode - - \li Stylesheets are interpreted as XSLT 2.0 stylesheets, even - if the \c version attribute is in the XSLT source is - 1.0. In other words, the version attribute is ignored. - - \row - \li Grouping - - \li \c fn:current-group(), \c fn:grouping-key() and \c - xsl:for-each-group. - - \row - \li Regexp elements - \li \c xsl:analyze-string, \c xsl:matching-substring, - \c xsl:non-matching-substring, and \c fn:regex-group() - \row - \li Date & Time formatting - \li \c fn:format-dateTime(), \c fn:format-date() and fn:format-time(). - - \row - \li XPath Conformance - \li Since XPath is a subset of XSLT, its issues are in affect too. - \endtable - - The Qt XML Patterns implementation of the XPath Data Model does not - include entities (due to QXmlStreamReader not reporting them). - This means that functions \c unparsed-entity-uri() and \c - unparsed-entity-public-id() always return negatively. - - \section2 XPath 2.0 - - Since XPath 2.0 is a subset of XQuery 1.0, XPath 2.0 is - supported. Areas where conformance may be questionable and, - consequently, where behavior may be changed in future releases - include: - - \list - \li Regular expression support is currently not conformant - but follows Qt's QRegExp standard syntax. - - \li Operators for \c xs:time, \c xs:date, and \c xs:dateTime - are incomplete. - - \li Formatting of very large or very small \c xs:double, \c - xs:float, and \c xs:decimal values may be incorrect. - \endlist - - \section2 xml:id - - Processing of XML files supports \c xml:id. This allows elements - that have an attribute named \c xml:id to be looked up efficiently - with the \c fn:id() function. See - \l{http://www.w3.org/TR/xml-id/}{xml:id Version 1.0} for details. - - \section2 XML Schema 1.0 - - There are two ways Qt XML Patterns can be used to validate schemas: - You can use the C++ API in your Qt application using the classes - QXmlSchema and QXmlSchemaValidator, or you can use the command line - utility named xmlpatternsvalidator (located in the "bin" directory - of your Qt build). - - The Qt XML Patterns implementation of XML Schema validation supports - the schema specification version 1.0 in large parts. Known problems - of the implementation and areas where conformancy may be questionable - are: - - \list - \li Large \c minOccurs or \c maxOccurs values or deeply nested ones - require huge amount of memory which might cause the system to freeze. - Such a schema should be rewritten to use \c unbounded as value instead - of large numbers. This restriction will hopefully be fixed in a later release. - \li Comparison of really small or large floating point values might lead to - wrong results in some cases. However such numbers should not be relevant - for day-to-day usage. - \li Regular expression support is currently not conformant but follows - Qt's QRegExp standard syntax. - \li Identity constraint checks can not use the values of default or fixed - attribute definitions. - \endlist - - \section2 Resource Loading - - When Qt XML Patterns loads an XML resource, e.g., using the - \c fn:doc() function, the following schemes are supported: - - \table - \header - \li Scheme Name - \li Description - \row - \li \c file - \li Local files. - \row - \li \c data - - \li The bytes are encoded in the URI itself. e.g., \c - data:application/xml,%3Ce%2F%3E is \c <e/>. - - \row - \li \c ftp - \li Resources retrieved via FTP. - \row - \li \c http - \li Resources retrieved via HTTP. - \row - \li \c https - \li Resources retrieved via HTTPS. This will succeed if no SSL - errors are encountered. - \row - \li \c qrc - \li Qt Resource files. Expressing it as an empty scheme, :/..., - is not supported. - - \endtable - - \section2 XML - - XML 1.0 and XML Namespaces 1.0 are supported, as opposed to the - 1.1 versions. When a strings is passed to a query as a QString, - the characters must be XML 1.0 characters. Otherwise, the behavior - is undefined. This is not checked. - - URIs are first passed to QAbstractUriResolver. Check - QXmlQuery::setUriResolver() for possible rewrites. -*/ - -/*! - \namespace QPatternist - \brief The QPatternist namespace contains classes and functions required by the Qt XML Patterns module. - \internal -*/ |