Browse Source

+ Basic implementation of TXPathNSResolver class, Mantis #25183.

git-svn-id: trunk@25814 -
sergei 12 years ago
parent
commit
8afc5b8ebf
2 changed files with 30 additions and 5 deletions
  1. 21 2
      packages/fcl-xml/src/xpath.pp
  2. 9 3
      packages/fcl-xml/tests/xpathts.pp

+ 21 - 2
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 }
 

+ 9 - 3
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;