| /**************************************************************************** |
| ** |
| ** Copyright (C) 2016 The Qt Company Ltd. |
| ** Contact: https://www.qt.io/licensing/ |
| ** |
| ** This file is part of the QtXmlPatterns module of the Qt Toolkit. |
| ** |
| ** $QT_BEGIN_LICENSE:LGPL$ |
| ** 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 The Qt Company. For licensing terms |
| ** and conditions see https://www.qt.io/terms-conditions. For further |
| ** information use the contact form at https://www.qt.io/contact-us. |
| ** |
| ** GNU Lesser General Public License Usage |
| ** Alternatively, this file may be used under the terms of the GNU Lesser |
| ** General Public License version 3 as published by the Free Software |
| ** Foundation and appearing in the file LICENSE.LGPL3 included in the |
| ** packaging of this file. Please review the following information to |
| ** ensure the GNU Lesser General Public License version 3 requirements |
| ** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. |
| ** |
| ** GNU General Public License Usage |
| ** Alternatively, this file may be used under the terms of the GNU |
| ** General Public License version 2.0 or (at your option) the GNU General |
| ** Public license version 3 or any later version approved by the KDE Free |
| ** Qt Foundation. The licenses are as published by the Free Software |
| ** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 |
| ** included in the packaging of this file. Please review the following |
| ** information to ensure the GNU General Public License requirements will |
| ** be met: https://www.gnu.org/licenses/gpl-2.0.html and |
| ** https://www.gnu.org/licenses/gpl-3.0.html. |
| ** |
| ** $QT_END_LICENSE$ |
| ** |
| ****************************************************************************/ |
| |
| #include "qanyuri_p.h" |
| #include "qatomizer_p.h" |
| #include "qbuiltintypes_p.h" |
| #include "qcardinalityverifier_p.h" |
| #include "qcommonsequencetypes_p.h" |
| #include "qcommonvalues_p.h" |
| #include "qemptysequence_p.h" |
| #include "qcommonnamespaces_p.h" |
| #include "qxmlname.h" |
| #include "qatomicstring_p.h" |
| |
| /* Functions */ |
| #include "qaccessorfns_p.h" |
| #include "qaggregatefns_p.h" |
| #include "qassemblestringfns_p.h" |
| #include "qbooleanfns_p.h" |
| #include "qcomparestringfns_p.h" |
| #include "qcomparingaggregator_p.h" |
| #include "qcontextfns_p.h" |
| #include "qdatetimefn_p.h" |
| #include "qdatetimefns_p.h" |
| #include "qdeepequalfn_p.h" |
| #include "qerrorfn_p.h" |
| #include "qnodefns_p.h" |
| #include "qnumericfns_p.h" |
| #include "qpatternmatchingfns_p.h" |
| #include "qqnamefns_p.h" |
| #include "qresolveurifn_p.h" |
| #include "qsequencefns_p.h" |
| #include "qsequencegeneratingfns_p.h" |
| #include "qstringvaluefns_p.h" |
| #include "qsubstringfns_p.h" |
| #include "qtimezonefns_p.h" |
| #include "qtracefn_p.h" |
| |
| #include "qxpath20corefunctions_p.h" |
| |
| QT_BEGIN_NAMESPACE |
| |
| using namespace QPatternist; |
| |
| Expression::Ptr XPath20CoreFunctions::retrieveExpression(const QXmlName name, |
| const Expression::List &args, |
| const FunctionSignature::Ptr &sign) const |
| { |
| Q_ASSERT(sign); |
| |
| Expression::Ptr fn; |
| #define testFN(ln, cname) else if(name.localName() == StandardLocalNames::ln) fn = Expression::Ptr(new cname()) |
| |
| if(false) /* Dummy for the macro handling. Will be optimized away anyway. */ |
| return Expression::Ptr(); |
| /* Alphabetic order. */ |
| testFN(QName, QNameFN); |
| testFN(abs, AbsFN); |
| testFN(adjust_date_to_timezone, AdjustDateToTimezoneFN); |
| testFN(adjust_dateTime_to_timezone, AdjustDateTimeToTimezoneFN); |
| testFN(adjust_time_to_timezone, AdjustTimeToTimezoneFN); |
| testFN(avg, AvgFN); |
| testFN(base_uri, BaseURIFN); |
| testFN(codepoint_equal, CodepointEqualFN); |
| testFN(codepoints_to_string, CodepointsToStringFN); |
| testFN(collection, CollectionFN); |
| testFN(compare, CompareFN); |
| testFN(current_date, CurrentDateFN); |
| testFN(current_dateTime, CurrentDateTimeFN); |
| testFN(current_time, CurrentTimeFN); |
| testFN(dateTime, DateTimeFN); |
| testFN(day_from_date, DayFromAbstractDateTimeFN); |
| testFN(day_from_dateTime, DayFromAbstractDateTimeFN); |
| testFN(days_from_duration, DaysFromDurationFN); |
| testFN(deep_equal, DeepEqualFN); |
| testFN(default_collation, DefaultCollationFN); |
| testFN(distinct_values, DistinctValuesFN); |
| testFN(doc, DocFN); |
| testFN(doc_available, DocAvailableFN); |
| testFN(document_uri, DocumentURIFN); |
| testFN(empty, Existence<Expression::IDEmptyFN>); |
| testFN(encode_for_uri, EncodeForURIFN); |
| testFN(ends_with, EndsWithFN); |
| testFN(error, ErrorFN); |
| testFN(escape_html_uri, EscapeHtmlURIFN); |
| testFN(exists, Existence<Expression::IDExistsFN>); |
| testFN(hours_from_dateTime, HoursFromAbstractDateTimeFN); |
| testFN(hours_from_duration, HoursFromDurationFN); |
| testFN(hours_from_time, HoursFromAbstractDateTimeFN); |
| testFN(idref, IdrefFN); |
| testFN(implicit_timezone, ImplicitTimezoneFN); |
| testFN(in_scope_prefixes, InScopePrefixesFN); |
| testFN(index_of, IndexOfFN); |
| testFN(insert_before, InsertBeforeFN); |
| testFN(iri_to_uri, IriToURIFN); |
| testFN(local_name_from_QName, LocalNameFromQNameFN); |
| testFN(lower_case, LowerCaseFN); |
| testFN(matches, MatchesFN); |
| testFN(max, MaxFN); |
| testFN(min, MinFN); |
| testFN(minutes_from_dateTime, MinutesFromAbstractDateTimeFN); |
| testFN(minutes_from_duration, MinutesFromDurationFN); |
| testFN(minutes_from_time, MinutesFromAbstractDateTimeFN); |
| testFN(month_from_date, MonthFromAbstractDateTimeFN); |
| testFN(month_from_dateTime, MonthFromAbstractDateTimeFN); |
| testFN(months_from_duration, MonthsFromDurationFN); |
| testFN(namespace_uri_for_prefix, NamespaceURIForPrefixFN); |
| testFN(namespace_uri_from_QName, NamespaceURIFromQNameFN); |
| testFN(nilled, NilledFN); |
| testFN(node_name, NodeNameFN); |
| testFN(normalize_unicode, NormalizeUnicodeFN); |
| testFN(prefix_from_QName, PrefixFromQNameFN); |
| testFN(remove, RemoveFN); |
| testFN(replace, ReplaceFN); |
| testFN(resolve_QName, ResolveQNameFN); |
| testFN(resolve_uri, ResolveURIFN); |
| testFN(generic_string_join, StringJoinFN); |
| testFN(reverse, ReverseFN); |
| testFN(root, RootFN); |
| testFN(round_half_to_even, RoundHalfToEvenFN); |
| testFN(seconds_from_dateTime, SecondsFromAbstractDateTimeFN); |
| testFN(seconds_from_duration, SecondsFromDurationFN); |
| testFN(seconds_from_time, SecondsFromAbstractDateTimeFN); |
| testFN(static_base_uri, StaticBaseURIFN); |
| testFN(string_join, StringJoinFN); |
| testFN(string_to_codepoints, StringToCodepointsFN); |
| testFN(subsequence, SubsequenceFN); |
| testFN(timezone_from_date, TimezoneFromAbstractDateTimeFN); |
| testFN(timezone_from_dateTime, TimezoneFromAbstractDateTimeFN); |
| testFN(timezone_from_time, TimezoneFromAbstractDateTimeFN); |
| testFN(tokenize, TokenizeFN); |
| testFN(trace, TraceFN); |
| testFN(upper_case, UpperCaseFN); |
| testFN(year_from_date, YearFromAbstractDateTimeFN); |
| testFN(year_from_dateTime, YearFromAbstractDateTimeFN); |
| testFN(years_from_duration, YearsFromDurationFN); |
| #undef testFN |
| |
| if(fn) |
| { |
| fn->setOperands(args); |
| fn->as<FunctionCall>()->setSignature(sign); |
| } |
| else |
| { |
| /* Do the ones which are not FunctionCall sub-classes. The effect is |
| * that FunctionCall sub-classes has "automatic" type checking in the base |
| * class done from the background of their function signature, while |
| * these special classes are on their own, and must do it manually. */ |
| if(name.localName() == StandardLocalNames::data) |
| fn = Expression::Ptr(new Atomizer(args.first())); |
| else if(name.localName() == StandardLocalNames::zero_or_one) |
| fn = Expression::Ptr(new CardinalityVerifier(args.first(), Cardinality::zeroOrOne(), |
| ReportContext::FORG0003)); |
| else if(name.localName() == StandardLocalNames::one_or_more) |
| fn = Expression::Ptr(new CardinalityVerifier(args.first(), Cardinality::oneOrMore(), |
| ReportContext::FORG0004)); |
| else if(name.localName() == StandardLocalNames::exactly_one) |
| fn = Expression::Ptr(new CardinalityVerifier(args.first(), Cardinality::exactlyOne(), |
| ReportContext::FORG0005)); |
| else if(name.localName() == StandardLocalNames::unordered) |
| /* We don't make use of the unordered() function, so just pop in |
| * the arg. */ |
| fn = args.first(); |
| } |
| |
| return fn; |
| } |
| |
| FunctionSignature::Ptr XPath20CoreFunctions::retrieveFunctionSignature(const NamePool::Ptr &np, |
| const QXmlName name) |
| { |
| if(StandardNamespaces::fn != name.namespaceURI() && name.namespaceURI() != StandardNamespaces::InternalXSLT) |
| return FunctionSignature::Ptr(); |
| |
| FunctionSignature::Ptr s(functionSignatures().value(name)); |
| |
| if(!s) |
| { |
| const QXmlName::LocalNameCode localName = name.localName(); |
| |
| /* Alphabetic order. */ |
| if(StandardLocalNames::QName == localName) |
| { |
| s = addFunction(StandardLocalNames::QName, 2, 2, CommonSequenceTypes::ExactlyOneQName); |
| s->appendArgument(argument(np, "paramURI"), CommonSequenceTypes::ZeroOrOneString); |
| s->appendArgument(argument(np, "paramQName"), CommonSequenceTypes::ExactlyOneString); |
| } |
| else if(StandardLocalNames::abs == localName) |
| { |
| s = addFunction(StandardLocalNames::abs, 1, 1, CommonSequenceTypes::ZeroOrOneNumeric, |
| Expression::EmptynessFollowsChild | Expression::RewriteToEmptyOnEmpty); |
| s->appendArgument(argument(np, "arg"), CommonSequenceTypes::ZeroOrOneNumeric); |
| } |
| else if(StandardLocalNames::adjust_date_to_timezone == localName) |
| { |
| s = addFunction(StandardLocalNames::adjust_date_to_timezone, 1, 2, CommonSequenceTypes::ZeroOrOneDate, |
| Expression::EmptynessFollowsChild | Expression::RewriteToEmptyOnEmpty); |
| s->appendArgument(argument(np, "arg"), CommonSequenceTypes::ZeroOrOneDate); |
| s->appendArgument(argument(np, "timezone"), CommonSequenceTypes::ZeroOrOneDayTimeDuration); |
| } |
| else if(StandardLocalNames::adjust_dateTime_to_timezone == localName) |
| { |
| s = addFunction(StandardLocalNames::adjust_dateTime_to_timezone, 1, 2, CommonSequenceTypes::ZeroOrOneDateTime, |
| Expression::EmptynessFollowsChild | Expression::RewriteToEmptyOnEmpty); |
| s->appendArgument(argument(np, "arg"), CommonSequenceTypes::ZeroOrOneDateTime); |
| s->appendArgument(argument(np, "timezone"), CommonSequenceTypes::ZeroOrOneDayTimeDuration); |
| } |
| else if(StandardLocalNames::adjust_time_to_timezone == localName) |
| { |
| s = addFunction(StandardLocalNames::adjust_time_to_timezone, 1, 2, CommonSequenceTypes::ZeroOrOneTime, |
| Expression::EmptynessFollowsChild | Expression::RewriteToEmptyOnEmpty); |
| s->appendArgument(argument(np, "arg"), CommonSequenceTypes::ZeroOrOneTime); |
| s->appendArgument(argument(np, "timezone"), CommonSequenceTypes::ZeroOrOneDayTimeDuration); |
| } |
| else if(StandardLocalNames::avg == localName) |
| { |
| s = addFunction(StandardLocalNames::avg, 1, 1, CommonSequenceTypes::ZeroOrOneAtomicType, |
| Expression::EmptynessFollowsChild | Expression::RewriteToEmptyOnEmpty); |
| s->appendArgument(argument(np, "arg"), CommonSequenceTypes::ZeroOrMoreAtomicTypes); |
| } |
| else if(StandardLocalNames::base_uri == localName) |
| { |
| s = addFunction(StandardLocalNames::base_uri, 0, 1, CommonSequenceTypes::ZeroOrOneAnyURI, |
| Expression::UseContextItem); |
| s->appendArgument(argument(np, "arg"), CommonSequenceTypes::ZeroOrOneNode); |
| } |
| else if(StandardLocalNames::codepoint_equal == localName) |
| { |
| s = addFunction(StandardLocalNames::codepoint_equal, 2, 2, CommonSequenceTypes::ZeroOrOneBoolean); |
| s->appendArgument(argument(np, "comparand1"), CommonSequenceTypes::ZeroOrOneString); |
| s->appendArgument(argument(np, "comparand2"), CommonSequenceTypes::ZeroOrOneString); |
| } |
| else if(StandardLocalNames::codepoints_to_string == localName) |
| { |
| s = addFunction(StandardLocalNames::codepoints_to_string, 1, 1, CommonSequenceTypes::ExactlyOneString); |
| s->appendArgument(argument(np, "arg"), CommonSequenceTypes::ZeroOrMoreIntegers); |
| } |
| else if(StandardLocalNames::collection == localName) |
| { |
| s = addFunction(StandardLocalNames::collection, 0, 1, CommonSequenceTypes::ZeroOrMoreNodes); |
| s->appendArgument(argument(np, "uri"), CommonSequenceTypes::ZeroOrOneString); |
| } |
| else if(StandardLocalNames::compare == localName) |
| { |
| s = addFunction(StandardLocalNames::compare, 2, 3, CommonSequenceTypes::ZeroOrOneInteger, |
| Expression::LastOperandIsCollation); |
| s->appendArgument(argument(np, "comparand1"), CommonSequenceTypes::ZeroOrOneString); |
| s->appendArgument(argument(np, "comparand2"), CommonSequenceTypes::ZeroOrOneString); |
| s->appendArgument(argument(np, "collation"), CommonSequenceTypes::ExactlyOneString); |
| } |
| else if(StandardLocalNames::current_date == localName) |
| { |
| s = addFunction(StandardLocalNames::current_date, 0, 0, CommonSequenceTypes::ExactlyOneDate, |
| Expression::DisableElimination); |
| } |
| else if(StandardLocalNames::current_dateTime == localName) |
| { |
| s = addFunction(StandardLocalNames::current_dateTime, 0, 0, CommonSequenceTypes::ExactlyOneDateTime, |
| Expression::DisableElimination); |
| } |
| else if(StandardLocalNames::current_time == localName) |
| { |
| s = addFunction(StandardLocalNames::current_time, 0, 0, CommonSequenceTypes::ExactlyOneTime, |
| Expression::DisableElimination); |
| } |
| else if(StandardLocalNames::data == localName) |
| { |
| s = addFunction(StandardLocalNames::data, 1, 1, CommonSequenceTypes::ZeroOrMoreAtomicTypes); |
| s->appendArgument(argument(np, "arg"), CommonSequenceTypes::ZeroOrMoreItems); |
| } |
| else if(StandardLocalNames::dateTime == localName) |
| { |
| s = addFunction(StandardLocalNames::dateTime, 2, 2, CommonSequenceTypes::ZeroOrOneDateTime); |
| s->appendArgument(argument(np, "arg1"), CommonSequenceTypes::ZeroOrOneDate); |
| s->appendArgument(argument(np, "arg2"), CommonSequenceTypes::ZeroOrOneTime); |
| } |
| else if(StandardLocalNames::day_from_date == localName) |
| { |
| s = addFunction(StandardLocalNames::day_from_date, 1, 1, CommonSequenceTypes::ZeroOrOneInteger, |
| Expression::EmptynessFollowsChild | Expression::RewriteToEmptyOnEmpty); |
| s->appendArgument(argument(np, "arg"), CommonSequenceTypes::ZeroOrOneDate); |
| } |
| else if(StandardLocalNames::day_from_dateTime == localName) |
| { |
| s = addFunction(StandardLocalNames::day_from_dateTime, 1, 1, CommonSequenceTypes::ZeroOrOneInteger, |
| Expression::EmptynessFollowsChild | Expression::RewriteToEmptyOnEmpty); |
| s->appendArgument(argument(np, "arg"), CommonSequenceTypes::ZeroOrOneDateTime); |
| } |
| else if(StandardLocalNames::days_from_duration == localName) |
| { |
| s = addFunction(StandardLocalNames::days_from_duration, 1, 1, CommonSequenceTypes::ZeroOrOneInteger, |
| Expression::EmptynessFollowsChild | Expression::RewriteToEmptyOnEmpty); |
| s->appendArgument(argument(np, "arg"), CommonSequenceTypes::ZeroOrOneDuration); |
| } |
| else if(StandardLocalNames::deep_equal == localName) |
| { |
| s = addFunction(StandardLocalNames::deep_equal, 2, 3, CommonSequenceTypes::ExactlyOneBoolean, |
| Expression::LastOperandIsCollation); |
| s->appendArgument(argument(np, "arg1"), CommonSequenceTypes::ZeroOrMoreItems); |
| s->appendArgument(argument(np, "arg2"), CommonSequenceTypes::ZeroOrMoreItems); |
| s->appendArgument(argument(np, "collation"), CommonSequenceTypes::ExactlyOneString); |
| } |
| else if(StandardLocalNames::default_collation == localName) |
| { |
| s = addFunction(StandardLocalNames::default_collation, 0, 0, CommonSequenceTypes::ExactlyOneString); |
| } |
| else if(StandardLocalNames::distinct_values == localName) |
| { |
| s = addFunction(StandardLocalNames::distinct_values, 1, 2, CommonSequenceTypes::ZeroOrMoreAtomicTypes, |
| Expression::LastOperandIsCollation | |
| Expression::EmptynessFollowsChild | |
| Expression::RewriteToEmptyOnEmpty); |
| s->appendArgument(argument(np, "arg"), CommonSequenceTypes::ZeroOrMoreAtomicTypes); |
| s->appendArgument(argument(np, "collation"), CommonSequenceTypes::ExactlyOneString); |
| } |
| else if(StandardLocalNames::doc == localName) |
| { |
| s = addFunction(StandardLocalNames::doc, 1, 1, CommonSequenceTypes::ZeroOrOneDocumentNode, Expression::DisableElimination); |
| s->appendArgument(argument(np, "uri"), CommonSequenceTypes::ZeroOrOneString); |
| } |
| else if(StandardLocalNames::doc_available == localName) |
| { |
| s = addFunction(StandardLocalNames::doc_available, 1, 1, CommonSequenceTypes::ExactlyOneBoolean, Expression::DisableElimination); |
| s->appendArgument(argument(np, "uri"), CommonSequenceTypes::ZeroOrOneString); |
| } |
| else if(StandardLocalNames::document_uri == localName) |
| { |
| s = addFunction(StandardLocalNames::document_uri, 1, 1, CommonSequenceTypes::ZeroOrOneAnyURI); |
| s->appendArgument(argument(np, "arg"), CommonSequenceTypes::ZeroOrOneNode); |
| } |
| else if(StandardLocalNames::empty == localName) |
| { |
| s = addFunction(StandardLocalNames::empty, 1, 1, CommonSequenceTypes::ExactlyOneBoolean, Expression::IDEmptyFN); |
| s->appendArgument(argument(np, "arg"), CommonSequenceTypes::ZeroOrMoreItems); |
| } |
| else if(StandardLocalNames::encode_for_uri == localName) |
| { |
| s = addFunction(StandardLocalNames::encode_for_uri, 1, 1, CommonSequenceTypes::ExactlyOneString); |
| s->appendArgument(argument(np, "uriPart"), CommonSequenceTypes::ZeroOrOneString); |
| } |
| else if(StandardLocalNames::ends_with == localName) |
| { |
| s = addFunction(StandardLocalNames::ends_with, 2, 3, CommonSequenceTypes::ExactlyOneBoolean, |
| Expression::LastOperandIsCollation); |
| s->appendArgument(argument(np, "arg1"), CommonSequenceTypes::ZeroOrOneString); |
| s->appendArgument(argument(np, "arg2"), CommonSequenceTypes::ZeroOrOneString); |
| s->appendArgument(argument(np, "collation"), CommonSequenceTypes::ExactlyOneString); |
| } |
| else if(StandardLocalNames::error == localName) |
| { |
| s = addFunction(StandardLocalNames::error, 0, 3, CommonSequenceTypes::None, |
| Expression::DisableElimination | Expression::DisableTypingDeduction); |
| s->appendArgument(argument(np, "error"), CommonSequenceTypes::ZeroOrOneQName); |
| s->appendArgument(argument(np, "description"), CommonSequenceTypes::ExactlyOneString); |
| s->appendArgument(argument(np, "errorObject"), CommonSequenceTypes::ZeroOrMoreItems); |
| } |
| else if(StandardLocalNames::escape_html_uri == localName) |
| { |
| s = addFunction(StandardLocalNames::escape_html_uri, 1, 1, CommonSequenceTypes::ExactlyOneString); |
| s->appendArgument(argument(np, "uri"), CommonSequenceTypes::ZeroOrOneString); |
| } |
| else if(StandardLocalNames::exactly_one == localName) |
| { |
| s = addFunction(StandardLocalNames::exactly_one, 1, 1, CommonSequenceTypes::ExactlyOneItem); |
| s->appendArgument(argument(np, "arg"), CommonSequenceTypes::ExactlyOneItem); |
| } |
| else if(StandardLocalNames::exists == localName) |
| { |
| s = addFunction(StandardLocalNames::exists, 1, 1, CommonSequenceTypes::ExactlyOneBoolean, Expression::IDExistsFN); |
| s->appendArgument(argument(np, "arg"), CommonSequenceTypes::ZeroOrMoreItems); |
| } |
| else if(StandardLocalNames::hours_from_dateTime == localName) |
| { |
| s = addFunction(StandardLocalNames::hours_from_dateTime, 1, 1, CommonSequenceTypes::ZeroOrOneInteger, |
| Expression::EmptynessFollowsChild | Expression::RewriteToEmptyOnEmpty); |
| s->appendArgument(argument(np, "arg"), CommonSequenceTypes::ZeroOrOneDateTime); |
| } |
| else if(StandardLocalNames::hours_from_duration == localName) |
| { |
| s = addFunction(StandardLocalNames::hours_from_duration, 1, 1, CommonSequenceTypes::ZeroOrOneInteger, |
| Expression::EmptynessFollowsChild | Expression::RewriteToEmptyOnEmpty); |
| s->appendArgument(argument(np, "arg"), CommonSequenceTypes::ZeroOrOneDuration); |
| } |
| else if(StandardLocalNames::hours_from_time == localName) |
| { |
| s = addFunction(StandardLocalNames::hours_from_time, 1, 1, CommonSequenceTypes::ZeroOrOneInteger, |
| Expression::EmptynessFollowsChild | Expression::RewriteToEmptyOnEmpty); |
| s->appendArgument(argument(np, "arg"), CommonSequenceTypes::ZeroOrOneTime); |
| } |
| else if(StandardLocalNames::idref == localName) |
| { |
| s = addFunction(StandardLocalNames::idref, 1, 2, CommonSequenceTypes::ZeroOrMoreElements, |
| Expression::UseContextItem); |
| s->appendArgument(argument(np, "idrefs"), CommonSequenceTypes::ZeroOrMoreStrings); |
| s->appendArgument(argument(np, "node"), CommonSequenceTypes::ExactlyOneNode); |
| } |
| else if(StandardLocalNames::implicit_timezone == localName) |
| { |
| s = addFunction(StandardLocalNames::implicit_timezone, 0, 0, CommonSequenceTypes::ExactlyOneDayTimeDuration, |
| Expression::DisableElimination); |
| } |
| else if(StandardLocalNames::in_scope_prefixes == localName) |
| { |
| s = addFunction(StandardLocalNames::in_scope_prefixes, 1, 1, CommonSequenceTypes::ZeroOrMoreStrings); |
| s->appendArgument(argument(np, "element"), CommonSequenceTypes::ExactlyOneElement); |
| } |
| else if(StandardLocalNames::index_of == localName) |
| { |
| s = addFunction(StandardLocalNames::index_of, 2, 3, CommonSequenceTypes::ZeroOrMoreIntegers, |
| Expression::LastOperandIsCollation); |
| s->appendArgument(argument(np, "seqParam"), CommonSequenceTypes::ZeroOrMoreAtomicTypes); |
| s->appendArgument(argument(np, "searchParam"), CommonSequenceTypes::ExactlyOneAtomicType); |
| s->appendArgument(argument(np, "collation"), CommonSequenceTypes::ExactlyOneString); |
| } |
| else if(StandardLocalNames::insert_before == localName) |
| { |
| s = addFunction(StandardLocalNames::insert_before, 3, 3, CommonSequenceTypes::ZeroOrMoreItems); |
| s->appendArgument(argument(np, "target"), CommonSequenceTypes::ZeroOrMoreItems); |
| s->appendArgument(argument(np, "position"), CommonSequenceTypes::ExactlyOneInteger); |
| s->appendArgument(argument(np, "insert"), CommonSequenceTypes::ZeroOrMoreItems); |
| } |
| else if(StandardLocalNames::iri_to_uri == localName) |
| { |
| s = addFunction(StandardLocalNames::iri_to_uri, 1, 1, CommonSequenceTypes::ExactlyOneString); |
| s->appendArgument(argument(np, "uri_part"), CommonSequenceTypes::ZeroOrOneString); |
| } |
| else if(StandardLocalNames::local_name_from_QName == localName) |
| { |
| s = addFunction(StandardLocalNames::local_name_from_QName, 1, 1, CommonSequenceTypes::ZeroOrOneNCName, |
| Expression::EmptynessFollowsChild | Expression::RewriteToEmptyOnEmpty); |
| s->appendArgument(argument(np, "arg"), CommonSequenceTypes::ZeroOrOneQName); |
| } |
| else if(StandardLocalNames::lower_case == localName) |
| { |
| s = addFunction(StandardLocalNames::lower_case, 1, 1, CommonSequenceTypes::ExactlyOneString, |
| Expression::IDLowerCaseFN); |
| s->appendArgument(argument(np, "arg"), CommonSequenceTypes::ZeroOrOneString); |
| } |
| else if(StandardLocalNames::matches == localName) |
| { |
| s = addFunction(StandardLocalNames::matches, 2, 3, CommonSequenceTypes::ExactlyOneBoolean); |
| s->appendArgument(argument(np, "input"), CommonSequenceTypes::ZeroOrOneString); |
| s->appendArgument(argument(np, "pattern"), CommonSequenceTypes::ExactlyOneString); |
| s->appendArgument(argument(np, "flags"), CommonSequenceTypes::ExactlyOneString); |
| } |
| else if(StandardLocalNames::max == localName) |
| { |
| s = addFunction(StandardLocalNames::max, 1, 2, CommonSequenceTypes::ZeroOrOneAtomicType, |
| Expression::LastOperandIsCollation | |
| Expression::EmptynessFollowsChild | |
| Expression::RewriteToEmptyOnEmpty); |
| s->appendArgument(argument(np, "arg"), CommonSequenceTypes::ZeroOrMoreAtomicTypes); |
| s->appendArgument(argument(np, "collation"), CommonSequenceTypes::ExactlyOneString); |
| } |
| else if(StandardLocalNames::min == localName) |
| { |
| s = addFunction(StandardLocalNames::min, 1, 2, CommonSequenceTypes::ZeroOrOneAtomicType, |
| Expression::LastOperandIsCollation | |
| Expression::EmptynessFollowsChild | |
| Expression::RewriteToEmptyOnEmpty); |
| s->appendArgument(argument(np, "arg"), CommonSequenceTypes::ZeroOrMoreAtomicTypes); |
| s->appendArgument(argument(np, "collation"), CommonSequenceTypes::ExactlyOneString); |
| } |
| else if(StandardLocalNames::minutes_from_dateTime == localName) |
| { |
| s = addFunction(StandardLocalNames::minutes_from_dateTime, 1, 1, CommonSequenceTypes::ZeroOrOneInteger, |
| Expression::EmptynessFollowsChild | Expression::RewriteToEmptyOnEmpty); |
| s->appendArgument(argument(np, "arg"), CommonSequenceTypes::ZeroOrOneDateTime); |
| } |
| else if(StandardLocalNames::minutes_from_duration == localName) |
| { |
| s = addFunction(StandardLocalNames::minutes_from_duration, 1, 1, CommonSequenceTypes::ZeroOrOneInteger, |
| Expression::EmptynessFollowsChild | Expression::RewriteToEmptyOnEmpty); |
| s->appendArgument(argument(np, "arg"), CommonSequenceTypes::ZeroOrOneDuration); |
| } |
| else if(StandardLocalNames::minutes_from_time == localName) |
| { |
| s = addFunction(StandardLocalNames::minutes_from_time, 1, 1, CommonSequenceTypes::ZeroOrOneInteger, |
| Expression::EmptynessFollowsChild | Expression::RewriteToEmptyOnEmpty); |
| s->appendArgument(argument(np, "arg"), CommonSequenceTypes::ZeroOrOneTime); |
| } |
| else if(StandardLocalNames::month_from_date == localName) |
| { |
| s = addFunction(StandardLocalNames::month_from_date, 1, 1, CommonSequenceTypes::ZeroOrOneInteger, |
| Expression::EmptynessFollowsChild | Expression::RewriteToEmptyOnEmpty); |
| s->appendArgument(argument(np, "arg"), CommonSequenceTypes::ZeroOrOneDate); |
| } |
| else if(StandardLocalNames::month_from_dateTime == localName) |
| { |
| s = addFunction(StandardLocalNames::month_from_dateTime, 1, 1, CommonSequenceTypes::ZeroOrOneInteger, |
| Expression::EmptynessFollowsChild | Expression::RewriteToEmptyOnEmpty); |
| s->appendArgument(argument(np, "arg"), CommonSequenceTypes::ZeroOrOneDateTime); |
| } |
| else if(StandardLocalNames::months_from_duration == localName) |
| { |
| s = addFunction(StandardLocalNames::months_from_duration, 1, 1, CommonSequenceTypes::ZeroOrOneInteger, |
| Expression::EmptynessFollowsChild | Expression::RewriteToEmptyOnEmpty); |
| s->appendArgument(argument(np, "arg"), CommonSequenceTypes::ZeroOrOneDuration); |
| } |
| else if(StandardLocalNames::namespace_uri_for_prefix == localName) |
| { |
| s = addFunction(StandardLocalNames::namespace_uri_for_prefix, 2, 2, CommonSequenceTypes::ZeroOrOneAnyURI); |
| s->appendArgument(argument(np, "prefix"), CommonSequenceTypes::ZeroOrOneString); |
| s->appendArgument(argument(np, "element"), CommonSequenceTypes::ExactlyOneElement); |
| } |
| else if(StandardLocalNames::namespace_uri_from_QName == localName) |
| { |
| s = addFunction(StandardLocalNames::namespace_uri_from_QName, 1, 1, CommonSequenceTypes::ZeroOrOneAnyURI, |
| Expression::EmptynessFollowsChild | Expression::RewriteToEmptyOnEmpty); |
| s->appendArgument(argument(np, "arg"), CommonSequenceTypes::ZeroOrOneQName); |
| } |
| else if(StandardLocalNames::nilled == localName) |
| { |
| s = addFunction(StandardLocalNames::nilled, 1, 1, CommonSequenceTypes::ZeroOrOneBoolean); |
| s->appendArgument(argument(np, "arg"), CommonSequenceTypes::ZeroOrOneNode); |
| } |
| else if(StandardLocalNames::node_name == localName) |
| { |
| s = addFunction(StandardLocalNames::node_name, 1, 1, CommonSequenceTypes::ZeroOrOneQName); |
| s->appendArgument(argument(np, "theNode"), CommonSequenceTypes::ZeroOrOneNode); |
| } |
| else if(StandardLocalNames::normalize_unicode == localName) |
| { |
| s = addFunction(StandardLocalNames::normalize_unicode, 1, 2, CommonSequenceTypes::ExactlyOneString); |
| s->appendArgument(argument(np, "arg"), CommonSequenceTypes::ZeroOrOneString); |
| s->appendArgument(argument(np, "normalizationForm"), CommonSequenceTypes::ExactlyOneString); |
| } |
| else if(StandardLocalNames::one_or_more == localName) |
| { |
| s = addFunction(StandardLocalNames::one_or_more, 1, 1, CommonSequenceTypes::OneOrMoreItems); |
| s->appendArgument(argument(np, "arg"), CommonSequenceTypes::ZeroOrMoreItems); |
| } |
| else if(StandardLocalNames::prefix_from_QName == localName) |
| { |
| s = addFunction(StandardLocalNames::prefix_from_QName, 1, 1, CommonSequenceTypes::ZeroOrOneNCName, |
| Expression::RewriteToEmptyOnEmpty); |
| s->appendArgument(argument(np, "arg"), CommonSequenceTypes::ZeroOrOneQName); |
| } |
| else if(StandardLocalNames::remove == localName) |
| { |
| s = addFunction(StandardLocalNames::remove, 2, 2, CommonSequenceTypes::ZeroOrMoreItems, |
| Expression::RewriteToEmptyOnEmpty); |
| s->appendArgument(argument(np, "target"), CommonSequenceTypes::ZeroOrMoreItems); |
| s->appendArgument(argument(np, "position"), CommonSequenceTypes::ExactlyOneInteger); |
| } |
| else if(StandardLocalNames::replace == localName) |
| { |
| s = addFunction(StandardLocalNames::replace, 3, 4, CommonSequenceTypes::ExactlyOneString); |
| s->appendArgument(argument(np, "input"), CommonSequenceTypes::ZeroOrOneString); |
| s->appendArgument(argument(np, "pattern"), CommonSequenceTypes::ExactlyOneString); |
| s->appendArgument(argument(np, "replacement"), CommonSequenceTypes::ExactlyOneString); |
| s->appendArgument(argument(np, "flags"), CommonSequenceTypes::ExactlyOneString); |
| } |
| else if(StandardLocalNames::resolve_QName == localName) |
| { |
| s = addFunction(StandardLocalNames::resolve_QName, 2, 2, CommonSequenceTypes::ZeroOrOneQName, |
| Expression::EmptynessFollowsChild | Expression::RewriteToEmptyOnEmpty); |
| s->appendArgument(argument(np, "qname"), CommonSequenceTypes::ZeroOrOneString); |
| s->appendArgument(argument(np, "element"), CommonSequenceTypes::ExactlyOneElement); |
| } |
| else if(StandardLocalNames::resolve_uri == localName) |
| { |
| s = addFunction(StandardLocalNames::resolve_uri, 1, 2, CommonSequenceTypes::ZeroOrOneAnyURI, |
| Expression::EmptynessFollowsChild | Expression::RewriteToEmptyOnEmpty); |
| s->appendArgument(argument(np, "relative"), CommonSequenceTypes::ZeroOrOneString); |
| s->appendArgument(argument(np, "base"), CommonSequenceTypes::ExactlyOneString); |
| } |
| else if(StandardLocalNames::reverse == localName) |
| { |
| s = addFunction(StandardLocalNames::reverse, 1, 1, CommonSequenceTypes::ZeroOrMoreItems); |
| s->appendArgument(argument(np, "arg"), CommonSequenceTypes::ZeroOrMoreItems); |
| } |
| else if(StandardLocalNames::root == localName) |
| { |
| s = addFunction(StandardLocalNames::root, 0, 1, CommonSequenceTypes::ZeroOrOneNode, |
| Expression::EmptynessFollowsChild | |
| Expression::RewriteToEmptyOnEmpty | |
| Expression::UseContextItem); |
| s->appendArgument(argument(np, "arg"), CommonSequenceTypes::ZeroOrOneNode); |
| } |
| else if(StandardLocalNames::round_half_to_even == localName) |
| { |
| s = addFunction(StandardLocalNames::round_half_to_even, 1, 2, CommonSequenceTypes::ZeroOrOneNumeric, |
| Expression::EmptynessFollowsChild | Expression::RewriteToEmptyOnEmpty); |
| s->appendArgument(argument(np, "arg"), CommonSequenceTypes::ZeroOrOneNumeric); |
| s->appendArgument(argument(np, "precision"), CommonSequenceTypes::ExactlyOneInteger); |
| } |
| else if(StandardLocalNames::seconds_from_dateTime == localName) |
| { |
| s = addFunction(StandardLocalNames::seconds_from_dateTime, 1, 1, CommonSequenceTypes::ZeroOrOneDecimal, |
| Expression::EmptynessFollowsChild | Expression::RewriteToEmptyOnEmpty); |
| s->appendArgument(argument(np, "arg"), CommonSequenceTypes::ZeroOrOneDateTime); |
| } |
| else if(StandardLocalNames::seconds_from_duration == localName) |
| { |
| s = addFunction(StandardLocalNames::seconds_from_duration, 1, 1, CommonSequenceTypes::ZeroOrOneDecimal, |
| Expression::EmptynessFollowsChild | Expression::RewriteToEmptyOnEmpty); |
| s->appendArgument(argument(np, "arg"), CommonSequenceTypes::ZeroOrOneDuration); |
| } |
| else if(StandardLocalNames::seconds_from_time == localName) |
| { |
| s = addFunction(StandardLocalNames::seconds_from_time, 1, 1, CommonSequenceTypes::ZeroOrOneDecimal, |
| Expression::EmptynessFollowsChild | Expression::RewriteToEmptyOnEmpty); |
| s->appendArgument(argument(np, "arg"), CommonSequenceTypes::ZeroOrOneTime); |
| } |
| else if(StandardLocalNames::static_base_uri == localName) |
| { |
| s = addFunction(StandardLocalNames::static_base_uri, 0, 0, CommonSequenceTypes::ExactlyOneAnyURI, Expression::EmptynessFollowsChild); |
| } |
| else if(StandardLocalNames::string_join == localName) |
| { |
| s = addFunction(StandardLocalNames::string_join, 2, 2, CommonSequenceTypes::ExactlyOneString); |
| s->appendArgument(argument(np, "arg1"), CommonSequenceTypes::ZeroOrMoreStrings); |
| s->appendArgument(argument(np, "separator"), CommonSequenceTypes::ExactlyOneString); |
| } |
| else if(StandardLocalNames::generic_string_join == localName) |
| { |
| s = addFunction(StandardLocalNames::generic_string_join, 2, 2, CommonSequenceTypes::ExactlyOneString, |
| Expression::IDIgnorableExpression, |
| Expression::Properties(), |
| StandardNamespaces::InternalXSLT); |
| s->appendArgument(argument(np, "arg1"), CommonSequenceTypes::ZeroOrMoreAtomicTypes); |
| s->appendArgument(argument(np, "separator"), CommonSequenceTypes::ExactlyOneString); |
| } |
| else if(StandardLocalNames::string_to_codepoints == localName) |
| { |
| s = addFunction(StandardLocalNames::string_to_codepoints, 1, 1, CommonSequenceTypes::ZeroOrMoreIntegers); |
| s->appendArgument(argument(np, "arg"), CommonSequenceTypes::ZeroOrOneString); |
| } |
| else if(StandardLocalNames::subsequence == localName) |
| { |
| s = addFunction(StandardLocalNames::subsequence, 2, 3, CommonSequenceTypes::ZeroOrMoreItems); |
| s->appendArgument(argument(np, "sourceSeq"), CommonSequenceTypes::ZeroOrMoreItems); |
| s->appendArgument(argument(np, "startingLoc"), CommonSequenceTypes::ExactlyOneDouble); |
| s->appendArgument(argument(np, "length"), CommonSequenceTypes::ExactlyOneDouble); |
| } |
| else if(StandardLocalNames::timezone_from_date == localName) |
| { |
| s = addFunction(StandardLocalNames::timezone_from_date, 1, 1, CommonSequenceTypes::ZeroOrOneDayTimeDuration, |
| Expression::RewriteToEmptyOnEmpty); |
| s->appendArgument(argument(np, "arg"), CommonSequenceTypes::ZeroOrOneDate); |
| } |
| else if(StandardLocalNames::timezone_from_dateTime == localName) |
| { |
| s = addFunction(StandardLocalNames::timezone_from_dateTime, 1, 1, CommonSequenceTypes::ZeroOrOneDayTimeDuration, |
| Expression::RewriteToEmptyOnEmpty); |
| s->appendArgument(argument(np, "arg"), CommonSequenceTypes::ZeroOrOneDateTime); |
| } |
| else if(StandardLocalNames::timezone_from_time == localName) |
| { |
| s = addFunction(StandardLocalNames::timezone_from_time, 1, 1, CommonSequenceTypes::ZeroOrOneDayTimeDuration, |
| Expression::RewriteToEmptyOnEmpty); |
| s->appendArgument(argument(np, "arg"), CommonSequenceTypes::ZeroOrOneTime); |
| } |
| else if(StandardLocalNames::tokenize == localName) |
| { |
| s = addFunction(StandardLocalNames::tokenize, 2, 3, CommonSequenceTypes::ZeroOrMoreStrings); |
| s->appendArgument(argument(np, "input"), CommonSequenceTypes::ZeroOrOneString); |
| s->appendArgument(argument(np, "pattern"), CommonSequenceTypes::ExactlyOneString); |
| s->appendArgument(argument(np, "flags"), CommonSequenceTypes::ExactlyOneString); |
| } |
| else if(StandardLocalNames::trace == localName) |
| { |
| s = addFunction(StandardLocalNames::trace, 2, 2, CommonSequenceTypes::ZeroOrMoreItems, |
| Expression::DisableElimination); |
| s->appendArgument(argument(np, "value"), CommonSequenceTypes::ZeroOrMoreItems); |
| s->appendArgument(argument(np, "label"), CommonSequenceTypes::ExactlyOneString); |
| } |
| else if(StandardLocalNames::unordered == localName) |
| { |
| s = addFunction(StandardLocalNames::unordered, 1, 1, CommonSequenceTypes::ZeroOrMoreItems); |
| s->appendArgument(argument(np, "sourceSeq"), CommonSequenceTypes::ZeroOrMoreItems); |
| } |
| else if(StandardLocalNames::upper_case == localName) |
| { |
| s = addFunction(StandardLocalNames::upper_case, 1, 1, CommonSequenceTypes::ExactlyOneString, |
| Expression::IDUpperCaseFN); |
| s->appendArgument(argument(np, "arg"), CommonSequenceTypes::ZeroOrOneString); |
| } |
| else if(StandardLocalNames::year_from_date == localName) |
| { |
| s = addFunction(StandardLocalNames::year_from_date, 1, 1, CommonSequenceTypes::ZeroOrOneInteger, |
| Expression::EmptynessFollowsChild | Expression::RewriteToEmptyOnEmpty); |
| s->appendArgument(argument(np, "arg"), CommonSequenceTypes::ZeroOrOneDate); |
| } |
| else if(StandardLocalNames::year_from_dateTime == localName) |
| { |
| s = addFunction(StandardLocalNames::year_from_dateTime, 1, 1, CommonSequenceTypes::ZeroOrOneInteger, |
| Expression::EmptynessFollowsChild | Expression::RewriteToEmptyOnEmpty); |
| s->appendArgument(argument(np, "arg"), CommonSequenceTypes::ZeroOrOneDateTime); |
| } |
| else if(StandardLocalNames::years_from_duration == localName) |
| { |
| s = addFunction(StandardLocalNames::years_from_duration, 1, 1, CommonSequenceTypes::ZeroOrOneInteger, |
| Expression::EmptynessFollowsChild | Expression::RewriteToEmptyOnEmpty); |
| s->appendArgument(argument(np, "arg"), CommonSequenceTypes::ZeroOrOneDuration); |
| } |
| else if(StandardLocalNames::zero_or_one == localName) |
| { |
| s = addFunction(StandardLocalNames::zero_or_one, 1, 1, CommonSequenceTypes::ZeroOrOneItem); |
| s->appendArgument(argument(np, "arg"), CommonSequenceTypes::ZeroOrMoreItems); |
| } |
| } |
| |
| return s; |
| } |
| |
| |
| QT_END_NAMESPACE |