StefH / XPath2.Net

Lightweight XPath2 for .NET
Microsoft Public License
36 stars 14 forks source link

Iterator content is missing in variable #6

Open nverwer opened 7 years ago

nverwer commented 7 years ago

Node iterators do not work correctly when one of the items is a variable containing the result of a previous XPath2 evaluation. I added the following test to XPath2ExtensionsTest (not the right place):

    public void XPath2_IteratorWithVariableTest()
    {
        System.Collections.Generic.Dictionary<XmlQualifiedName, object> vars = new System.Collections.Generic.Dictionary<XmlQualifiedName, object>();
        var nav = GetTodoListDoc().CreateNavigator();
        var prov = new NodeProvider(nav);
        var result = nav.XPath2Evaluate("/todo-list/todo-item[1]");
        vars[new XmlQualifiedName("x")] = result;
        var expr = XPath2Expression.Compile("($x, /todo-list/todo-item[2])");
        result = expr.Evaluate(prov, vars);
        vars[new XmlQualifiedName("y")] = result;
        expr = XPath2Expression.Compile("($y, /todo-list/todo-item[3])");
        result = expr.Evaluate(prov, vars);
        vars[new XmlQualifiedName("z")] = result;
    }

After every evaluation, the result contains only one item, which is the selected node. I would expect the result to contain 3 items at the end. The contents of the variable are lost.

nverwer commented 7 years ago

If I 'solidify' the result after evaluating an expression, using

result = BufferedNodeIterator.Preload(result as XPath2NodeIterator);

the test seems to work. The problem is, that before making the result into a BufferedNodeIterator, result.Count is incorrect. Then I tried to make the result into a list before assigning it to a variable:

result = (result as XPath2NodeIterator).ToList();

This works, and the Count is right. Is this the recommended way of storing an iterator in a variable?