From 8afc5b8ebfceca0dc9c9a06525371f9db5634515 Mon Sep 17 00:00:00 2001 From: sergei Date: Fri, 18 Oct 2013 08:36:19 +0000 Subject: [PATCH] + Basic implementation of TXPathNSResolver class, Mantis #25183. git-svn-id: trunk@25814 - --- packages/fcl-xml/src/xpath.pp | 23 +++++++++++++++++++++-- packages/fcl-xml/tests/xpathts.pp | 12 +++++++++--- 2 files changed, 30 insertions(+), 5 deletions(-) diff --git a/packages/fcl-xml/src/xpath.pp b/packages/fcl-xml/src/xpath.pp index 76cc2cf6c8..55c77ac7b0 100644 --- a/packages/fcl-xml/src/xpath.pp +++ b/packages/fcl-xml/src/xpath.pp @@ -348,8 +348,13 @@ type property Value: DOMString read FValue; end; - - TXPathNSResolver = TDOMNode {!!! experimental}; + TXPathNSResolver = class + protected + FNode: TDOMNode; + public + constructor Create(aNode: TDOMNode); + function LookupNamespaceURI(const aPrefix: DOMString): DOMString; virtual; + end; { XPath lexical scanner } @@ -2815,7 +2820,21 @@ begin Result := TXPathNumberVariable.Create(num); end; +{ TXPathNSResolver } +constructor TXPathNSResolver.Create(aNode: TDOMNode); +begin + inherited Create; + FNode := aNode; +end; + +function TXPathNSResolver.LookupNamespaceURI(const aPrefix: DOMString): DOMString; +begin + if assigned(FNode) then + result := FNode.LookupNamespaceURI(aPrefix) + else + result := ''; +end; { TXPathExpression } diff --git a/packages/fcl-xml/tests/xpathts.pp b/packages/fcl-xml/tests/xpathts.pp index 1881c4fae3..d6f015e035 100644 --- a/packages/fcl-xml/tests/xpathts.pp +++ b/packages/fcl-xml/tests/xpathts.pp @@ -929,6 +929,7 @@ var doc: TXMLDocument; rslt: TXPathVariable; nsdoc: TXMLDocument; + resolver: TXPathNSResolver; begin for i := 0 to High(tests) do begin @@ -937,11 +938,16 @@ begin nsdoc := ParseString(tests[i].re); try try - rslt := EvaluateXPathExpression(tests[i].expr, doc.DocumentElement, nsdoc.DocumentElement); + resolver := TXPathNSResolver.Create(nsdoc.DocumentElement); try - CheckResult(tests[i], rslt); + rslt := EvaluateXPathExpression(tests[i].expr, doc.DocumentElement, resolver); + try + CheckResult(tests[i], rslt); + finally + rslt.Free; + end; finally - rslt.Free; + resolver.Free; end; except writeln;