Update of /cvsroot/mvp-xml/Common/v2/src/XPath In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv1205/v2/src/XPath Modified Files: DynamicContext.cs IHasXPathNavigator.cs IndexingXPathNavigator.cs SubtreeeXPathNavigator.cs XPathCache.cs XPathIteratorReader.cs XPathNavigatorIterator.cs Log Message: Index: DynamicContext.cs =================================================================== RCS file: /cvsroot/mvp-xml/Common/v2/src/XPath/DynamicContext.cs,v retrieving revision 1.1 retrieving revision 1.2 diff -u -d -r1.1 -r1.2 --- DynamicContext.cs 19 Oct 2005 14:46:30 -0000 1.1 +++ DynamicContext.cs 25 Oct 2005 21:33:44 -0000 1.2 @@ -25,7 +25,8 @@ { #region Private vars - IDictionary<string, DynamicVariable> _variables = new Dictionary<string, DynamicVariable>(); + IDictionary<string, IXsltContextVariable> _variables = + new Dictionary<string, IXsltContextVariable>(); #endregion Private @@ -84,7 +85,7 @@ #region Common Overrides /// <summary> - /// Implementation equal to <see cref="XsltContext.CompareDocument(string, string)"/>. + /// Implementation equal to <see cref="XsltContext"/>. /// </summary> public override int CompareDocument(string baseUri, string nextbaseUri) { @@ -116,7 +117,7 @@ } /// <summary> - /// Same as <see cref="XsltContext.PreserveWhitespace(XPathNavigator)"/>. + /// Same as <see cref="XsltContext"/>. /// </summary> public override bool PreserveWhitespace(XPathNavigator node) { @@ -124,7 +125,7 @@ } /// <summary> - /// Same as <see cref="XsltContext.Whitespace"/>. + /// Same as <see cref="XsltContext"/>. /// </summary> public override bool Whitespace { @@ -209,7 +210,7 @@ /// </summary> public override IXsltContextVariable ResolveVariable(string prefix, string name) { - return _variables[name] as IXsltContextVariable; + return _variables[name]; } #endregion Variable Handling Code Index: XPathIteratorReader.cs =================================================================== RCS file: /cvsroot/mvp-xml/Common/v2/src/XPath/XPathIteratorReader.cs,v retrieving revision 1.1 retrieving revision 1.2 diff -u -d -r1.1 -r1.2 --- XPathIteratorReader.cs 19 Oct 2005 14:46:30 -0000 1.1 +++ XPathIteratorReader.cs 25 Oct 2005 21:33:44 -0000 1.2 @@ -1,8 +1,7 @@ #region using using System; -using System.Collections; -using System.Collections.Specialized; +using System.Collections.Generic; using System.IO; using System.Xml; using System.Xml.Serialization; @@ -142,8 +141,8 @@ { get { return _current.IsEmptyElement; } } - - /// <summary>See <see cref="XmlReader.this[string, string]"/></summary> + + /// <summary>See <see cref="XmlReader.this[string, string]"/></summary> public override string this[string name, string ns] { get { return _current[name, ns]; } @@ -261,8 +260,8 @@ { return _current.LookupNamespace(prefix); } - - /// <summary>See <see cref="XmlReader.MoveToAttribute(string, string)"/></summary> + + /// <summary>See <see cref="XmlReader.MoveToAttribute(string, string)"/></summary> public override bool MoveToAttribute(string name, string ns) { return _current.MoveToAttribute(name, ns); @@ -318,7 +317,7 @@ if (read) { // Just move to the next node and create the reader. - _current = _iterator.Current.ReadSubtree(); + _current = _iterator.Current.ReadSubtree(); return _current.Read(); } else @@ -465,7 +464,7 @@ get { return false; } } - /// <summary>See <see cref="XmlReader.this[string, string]"/></summary> + /// <summary>See <see cref="XmlReader.this[string, string]"/></summary> public override string this[string name, string ns] { get { return null; } @@ -477,7 +476,7 @@ get { return null; } } - /// <summary>See <see cref="XmlReader.this[string]"/></summary> + /// <summary>See <see cref="XmlReader.this[int]"/></summary> public override string this[int i] { get { return null; } @@ -558,8 +557,8 @@ { _state = ReadState.Closed; } - - /// <summary>See <see cref="XmlReader.GetAttribute(string, string)"/></summary> + + /// <summary>See <see cref="XmlReader.GetAttribute(string, string)"/></summary> public override string GetAttribute(string name, string ns) { return null; @@ -582,8 +581,8 @@ { return null; } - - /// <summary>See <see cref="XmlReader.MoveToAttribute(string, string)"/></summary> + + /// <summary>See <see cref="XmlReader.MoveToAttribute(string, string)"/></summary> public override bool MoveToAttribute(string name, string ns) { return false; Index: IndexingXPathNavigator.cs =================================================================== RCS file: /cvsroot/mvp-xml/Common/v2/src/XPath/IndexingXPathNavigator.cs,v retrieving revision 1.1 retrieving revision 1.2 diff -u -d -r1.1 -r1.2 --- IndexingXPathNavigator.cs 19 Oct 2005 14:46:30 -0000 1.1 +++ IndexingXPathNavigator.cs 25 Oct 2005 21:33:44 -0000 1.2 @@ -18,8 +18,9 @@ /// and not searhing the tree. This allows drastically decrease selection time /// on preindexed selections. /// </summary> - /// <remarks>Author: Oleg Tkachenko, ol...@tk... - /// Contributors: Daniel Cazzulino, kz...@gm... + /// <remarks> + /// <para>Author: Oleg Tkachenko, ol...@xm...</para> + /// <para>Contributors: Daniel Cazzulino, kz...@gm...</para> /// <para>See http://www.tkachenko.com/blog/archives/000194.html</para> /// </remarks> public class IndexingXPathNavigator : XPathNavigator @@ -246,7 +247,7 @@ } /// <summary> - /// See <see cref="XPathNavigator.MoveToFirstNamespace(XPathNamespaceScope)"/>. + /// See <see cref="XPathNavigator.MoveToFirstNamespace(XPathNamespaceScope)"/>. /// </summary> public override bool MoveToFirstNamespace(XPathNamespaceScope namespaceScope) { @@ -254,7 +255,7 @@ } /// <summary> - /// See <see cref="XPathNavigator.MoveToNextNamespace(XPathNamespaceScope)"/>. + /// See <see cref="XPathNavigator.MoveToNextNamespace(XPathNamespaceScope)"/>. /// </summary> public override bool MoveToNextNamespace(XPathNamespaceScope namespaceScope) { @@ -585,20 +586,16 @@ /// </summary> private class XPathNavigatorIndex { - private IList<KeyDef> keys; - private IDictionary<string, List<XPathNavigator>> index; - private Type arrayIteratorType; + private List<KeyDef> keys; + private IDictionary<string, List<XPathNavigator>> index; /// <summary> /// Creates index over specified XPathNavigator. /// </summary> public XPathNavigatorIndex() { - keys = new List<KeyDef>(); - index = new Dictionary<string, List<XPathNavigator>>(); - Assembly systemXml = typeof(XPathNodeIterator).Assembly; - // TODO: is there another way? - arrayIteratorType = systemXml.GetType("System.Xml.XPath.XPathArrayIterator"); + keys = new List<KeyDef>(); + index = new Dictionary<string, List<XPathNavigator>>(); } /// <summary> @@ -630,13 +627,12 @@ XPathNodeIterator nodes = keyValue as XPathNodeIterator; while (nodes.MoveNext()) { - IList<XPathNavigator> chunkOfIndexedNodes = index[nodes.Current.Value]; - if (chunkOfIndexedNodes != null) - { - if (indexedNodes == null) - indexedNodes = new List<XPathNavigator>(); - indexedNodes.AddRange(chunkOfIndexedNodes); - } + if (index.ContainsKey(nodes.Current.Value)) + { + if (indexedNodes == null) + indexedNodes = new List<XPathNavigator>(); + indexedNodes.AddRange(index[nodes.Current.Value]); + } } } else @@ -644,11 +640,9 @@ indexedNodes = index[keyValue.ToString()]; } if (indexedNodes == null) - indexedNodes = new List<XPathNavigator>(0); + indexedNodes = new List<XPathNavigator>(0); - return (XPathNodeIterator) Activator.CreateInstance( arrayIteratorType, - BindingFlags.Instance | BindingFlags.Public | - BindingFlags.CreateInstance, null, new object[]{indexedNodes}, null ); + return new XPathNavigatorIterator(indexedNodes); } /// <summary> @@ -691,12 +685,16 @@ private void AddNodeToIndex(XPathNavigator node, string key) { //Get slot - List<XPathNavigator> indexedNodes = index[key]; - if (indexedNodes == null) - { - indexedNodes = new List<XPathNavigator>(); - index.Add(key, indexedNodes); - } + List<XPathNavigator> indexedNodes; + if (index.ContainsKey(key)) + { + indexedNodes = index[key]; + } + else + { + indexedNodes = new List<XPathNavigator>(); + index.Add(key, indexedNodes); + } indexedNodes.Add(node.Clone()); } } @@ -726,13 +724,17 @@ this.nav = nav; //Named indexes are stored in a hashtable. if (indexes == null) - indexes = new Dictionary<string, XPathNavigatorIndex>(); - XPathNavigatorIndex index = indexes[indexName]; - if (index == null) - { - index = new XPathNavigatorIndex(); + indexes = new Dictionary<string, XPathNavigatorIndex>(); + XPathNavigatorIndex index; + if (indexes.ContainsKey(indexName)) + { + index = indexes[indexName]; + } + else + { + index = new XPathNavigatorIndex(); indexes.Add(indexName, index); - } + } index.AddKey(key); } Index: IHasXPathNavigator.cs =================================================================== RCS file: /cvsroot/mvp-xml/Common/v2/src/XPath/IHasXPathNavigator.cs,v retrieving revision 1.1 retrieving revision 1.2 diff -u -d -r1.1 -r1.2 --- IHasXPathNavigator.cs 19 Oct 2005 14:46:30 -0000 1.1 +++ IHasXPathNavigator.cs 25 Oct 2005 21:33:44 -0000 1.2 @@ -9,6 +9,9 @@ /// <summary> /// Enables a class to return an XPathNavigator from the current context or position. /// </summary> + /// <remarks> + /// <para>Author: Oleg Tkachenko, ol...@xm...</para> + /// </remarks> public interface IHasXPathNavigator { /// <summary> Index: XPathCache.cs =================================================================== RCS file: /cvsroot/mvp-xml/Common/v2/src/XPath/XPathCache.cs,v retrieving revision 1.1 retrieving revision 1.2 diff -u -d -r1.1 -r1.2 --- XPathCache.cs 19 Oct 2005 14:46:30 -0000 1.1 +++ XPathCache.cs 25 Oct 2005 21:33:44 -0000 1.2 @@ -2,6 +2,7 @@ using System; using System.Collections; +using System.Collections.Generic; using System.Xml; using System.Xml.XPath; @@ -32,17 +33,17 @@ /// Initially a simple hashtable. In the future should /// implement sliding expiration of unused expressions. /// </summary> - private static IDictionary Cache + private static IDictionary<string, XPathExpression> Cache { get { return _cache; } - } static IDictionary _cache = new Hashtable(); + } static IDictionary<string, XPathExpression> _cache = new Dictionary<string, XPathExpression>(); /// <summary> /// Retrieves a cached compiled expression, or a newly compiled one. /// </summary> private static XPathExpression GetCompiledExpression(string expression, XPathNavigator source) { - XPathExpression expr = (XPathExpression) Cache[expression]; + XPathExpression expr = Cache[expression]; // No double checks. At most we will compile twice. No big deal. if (expr == null) @@ -333,7 +334,7 @@ /// Selects a node set using the specified XPath expression and sort. /// </summary> /// <remarks> - /// See <see cref="XPathExpression.AddSort(object, IComparer)"/>. + /// See <see cref="XPathExpression.AddSort(object, IComparer)"/>. /// </remarks> public static XPathNodeIterator SelectSorted(string expression, XPathNavigator source, object sortExpression, XmlSortOrder order, XmlCaseOrder caseOrder, string lang, XmlDataType dataType ) @@ -531,7 +532,7 @@ /// Selects a node set using the specified XPath expression and sort. /// </summary> /// <remarks> - /// See <see cref="XPathExpression.AddSort(object, IComparer)"/>. + /// See <see cref="XPathExpression.AddSort(object, IComparer)"/>. /// </remarks> public static XmlNodeList SelectNodesSorted(string expression, XmlNode source, object sortExpression, IComparer comparer) @@ -543,8 +544,8 @@ /// <summary> /// Selects a node set using the specified XPath expression and sort. /// </summary> - /// <remarks> - /// See <see cref="XPathExpression.AddSort(object, IComparer)"/>. + /// <remarks>(object, IComparer) + /// See <see cref="XPathExpression.AddSort(object, IComparer)"/>. /// </remarks> public static XmlNodeList SelectNodesSorted(string expression, XmlNode source, object sortExpression, XmlSortOrder order, XmlCaseOrder caseOrder, string lang, XmlDataType dataType ) Index: SubtreeeXPathNavigator.cs =================================================================== RCS file: /cvsroot/mvp-xml/Common/v2/src/XPath/SubtreeeXPathNavigator.cs,v retrieving revision 1.1 retrieving revision 1.2 diff -u -d -r1.1 -r1.2 --- SubtreeeXPathNavigator.cs 19 Oct 2005 14:46:30 -0000 1.1 +++ SubtreeeXPathNavigator.cs 25 Oct 2005 21:33:44 -0000 1.2 @@ -1,11 +1,8 @@ #region using using System; -using System.Collections; using System.Xml; using System.Xml.XPath; -using System.Xml.Xsl; -using System.Reflection; #endregion using @@ -19,7 +16,7 @@ /// <remarks>Author: Daniel Cazzulino, kz...@gm... /// <para>See http://weblogs.asp.net/cazzu/archive/2004/06/24/164243.aspx</para> /// </remarks> - public class SubtreeeXPathNavigator : XPathNavigator + public class SubtreeXPathNavigator : XPathNavigator { #region Fields & Ctors @@ -33,18 +30,18 @@ bool _fragment; /// <summary> - /// Creates SubtreeeXPathNavigator over specified XPathNavigator. + /// Creates SubtreeXPathNavigator over specified XPathNavigator. /// </summary> /// <param name="navigator">Navigator that determines scope.</param> /// <remarks>The incoming navigator is cloned upon construction, /// which isolates the calling code from movements to the - /// <see cref="SubtreeeXPathNavigator"/>.</remarks> - public SubtreeeXPathNavigator(XPathNavigator navigator) : this(navigator, false) + /// <see cref="SubtreeXPathNavigator"/>.</remarks> + public SubtreeXPathNavigator(XPathNavigator navigator) : this(navigator, false) { } /// <summary> - /// Creates SubtreeeXPathNavigator over specified XPathNavigator. + /// Creates SubtreeXPathNavigator over specified XPathNavigator. /// </summary> /// <param name="navigator">Navigator that determines scope.</param> /// <param name="enableFragment">Whether the navigator should be able to @@ -52,15 +49,15 @@ /// scope.</param> /// <remarks>The incoming navigator is cloned upon construction, /// which isolates the calling code from movements to the - /// <see cref="SubtreeeXPathNavigator"/>.</remarks> - public SubtreeeXPathNavigator(XPathNavigator navigator, bool enableFragment) + /// <see cref="SubtreeXPathNavigator"/>.</remarks> + public SubtreeXPathNavigator(XPathNavigator navigator, bool enableFragment) { _navigator = navigator.Clone(); _root = navigator.Clone(); _fragment = enableFragment; } - private SubtreeeXPathNavigator(XPathNavigator root, XPathNavigator current, + private SubtreeXPathNavigator(XPathNavigator root, XPathNavigator current, bool atRoot, bool enableFragment) { _root = root.Clone(); @@ -196,12 +193,12 @@ #region Methods /// <summary> - /// Creates new cloned version of the <see cref="SubtreeeXPathNavigator"/>. + /// Creates new cloned version of the <see cref="SubtreeXPathNavigator"/>. /// </summary> - /// <returns>Cloned copy of the <see cref="SubtreeeXPathNavigator"/>.</returns> + /// <returns>Cloned copy of the <see cref="SubtreeXPathNavigator"/>.</returns> public override XPathNavigator Clone() { - return new SubtreeeXPathNavigator(_root, _navigator, _atroot, _fragment); + return new SubtreeXPathNavigator(_root, _navigator, _atroot, _fragment); } /// <summary> @@ -209,10 +206,10 @@ /// </summary> public override bool IsSamePosition(XPathNavigator other) { - if (other == null || !(other is SubtreeeXPathNavigator)) + if (other == null || !(other is SubtreeXPathNavigator)) return false; - SubtreeeXPathNavigator nav = (SubtreeeXPathNavigator) other; + SubtreeXPathNavigator nav = (SubtreeXPathNavigator) other; return nav._atroot == this._atroot && nav._navigator.IsSamePosition(this._navigator) && nav._root.IsSamePosition(this._root); @@ -233,10 +230,10 @@ /// </summary> public override bool MoveTo(XPathNavigator other) { - if (other == null || !(other is SubtreeeXPathNavigator)) + if (other == null || !(other is SubtreeXPathNavigator)) return false; - return _navigator.MoveTo(((SubtreeeXPathNavigator)other)._navigator); + return _navigator.MoveTo(((SubtreeXPathNavigator)other)._navigator); } /// <summary> @@ -401,7 +398,7 @@ } /// <summary> - /// See <see cref="XPathNavigator.MoveToFirstNamespace(XPathNamespaceScope)"/>. + /// See <see cref="XPathNavigator.MoveToFirstNamespace(XPathNamespaceScope)"/>. /// </summary> public override bool MoveToFirstNamespace(XPathNamespaceScope namespaceScope) { @@ -409,7 +406,7 @@ } /// <summary> - /// See <see cref="XPathNavigator.MoveToNextNamespace(XPathNamespaceScope)"/>. + /// See <see cref="XPathNavigator.MoveToNextNamespace(XPathNamespaceScope)"/>. /// </summary> public override bool MoveToNextNamespace(XPathNamespaceScope namespaceScope) { Index: XPathNavigatorIterator.cs =================================================================== RCS file: /cvsroot/mvp-xml/Common/v2/src/XPath/XPathNavigatorIterator.cs,v retrieving revision 1.1 retrieving revision 1.2 diff -u -d -r1.1 -r1.2 --- XPathNavigatorIterator.cs 19 Oct 2005 14:46:30 -0000 1.1 +++ XPathNavigatorIterator.cs 25 Oct 2005 21:33:44 -0000 1.2 @@ -9,16 +9,15 @@ namespace Mvp.Xml.Common.XPath { /// <summary> - /// An <see cref="XPathNodeIterator"/> over a collection of - /// <see cref="XPathItem"/> items. Also allows - /// arbitrary addition/removal of the <see cref="XPathItem"/> - /// items that belong to the set. + /// An <see cref="XPathNodeIterator"/> that allows + /// arbitrary addition of the <see cref="XPathNavigator"/> + /// nodes that belong to the set. /// </summary> public class XPathNavigatorIterator : XPathNodeIterator { #region Fields & Ctors - private List<XPathNavigator> _navigators; + private List<XPathNavigator> _navigators; private int _position = -1; /// <summary> @@ -26,82 +25,34 @@ /// </summary> public XPathNavigatorIterator() { - _navigators = new List<XPathNavigator>(); + _navigators = new List<XPathNavigator>(); } - /// <summary> - /// Initializes a new instance of the <see cref="XPathNavigatorIterator"/>. - /// </summary> - public XPathNavigatorIterator(int capacity) - { - _navigators = new List<XPathNavigator>(capacity); - } + /// <summary> + /// Initializes a new instance of the <see cref="XPathNavigatorIterator"/> + /// with given initial capacity. + /// </summary> + public XPathNavigatorIterator(int capacity) + { + _navigators = new List<XPathNavigator>(capacity); + } /// <summary> /// Initializes a new instance of the <see cref="XPathNavigatorIterator"/>, /// using the received navigator as the initial item in the set. /// </summary> public XPathNavigatorIterator(XPathNavigator navigator) - : this() { + : this() { _navigators.Add(navigator); - } - - /// <summary> - /// Initializes a new instance of the <see cref="XPathNavigatorIterator"/>, - /// using the received navigators as the initial set. - /// </summary> - public XPathNavigatorIterator(XPathNodeIterator navigators) - : this() { - foreach (XPathNavigator nav in navigators) - { - _navigators.Add(nav); - } - } - - /// <summary> - /// Initializes a new instance of the <see cref="XPathNavigatorIterator"/>, - /// using the received navigators as the initial set. - /// </summary> - /// <param name="removeDuplicates">A flag that indicates whether duplicate nodes - /// should be loaded into the nodelist or only node with unique identity should - /// be added</param> - - public XPathNavigatorIterator(XPathNodeIterator navigators, bool removeDuplicates) - : this() - { - XPathNodeIterator it = navigators.Clone(); - - while (it.MoveNext()) - { - if (removeDuplicates) - { - if (_navigators.Contains(it.Current)) - { - continue; - } - } - _navigators.Add(it.Current.Clone()); - } - - } - - /// <summary> - /// Initializes a new instance of the <see cref="XPathNavigatorIterator"/>, - /// using the received navigators as the initial set. - /// </summary> - public XPathNavigatorIterator(XPathNavigator[] navigators) - : this() - { - _navigators.AddRange(navigators); - } + } /// <summary> - /// Initializes a new instance of the <see cref="XPathNavigatorIterator"/>, - /// using the received navigators as the initial set. + /// Initializes a new instance of the <see cref="XPathNavigatorIterator"/> + /// using given list of navigators. /// </summary> - private XPathNavigatorIterator(IEnumerable<XPathNavigator> navigators) + public XPathNavigatorIterator(List<XPathNavigator> navigators) { - _navigators = new List<XPathNavigator>(navigators); + _navigators = navigators; } #endregion Fields & Ctors @@ -119,7 +70,7 @@ SR.XPathNavigatorIterator_CantAddAfterMove); _navigators.Add(navigator.Clone()); - } + } /// <summary> /// Adds a <see cref="XPathNodeIterator"/> containing a set of navigators to add. @@ -137,87 +88,21 @@ } } - /// <summary> - /// Adds a collection of <see cref="XPathNavigator"/> nodes to the set. - /// </summary> - /// <param name="navigators">The set of navigators to add. Each one is cloned automatically.</param> - public void Add(IEnumerable<XPathNavigator> navigators) - { - if (_position != -1) - throw new InvalidOperationException( - SR.XPathNavigatorIterator_CantAddAfterMove); - - foreach (XPathNavigator nav in navigators) - { - _navigators.Add(nav.Clone()); - } - } - - /// <summary> - /// Gets or sets the element at the specified index - /// </summary> - public XPathNavigator this[int index] - { - get { return _navigators[index]; } - set { _navigators[index] = value; } - } - - /// <summary> - /// Determines whether the list contains a navigator positioned at the same - /// location as the specified XPathNavigator. This - /// method relies on the IsSamePositon() method of the XPathNavightor. - /// </summary> - /// <param name="value">The object to locate in the list.</param> - /// <returns>true if the object is found in the list; otherwise, false.</returns> - public bool Contains(XPathNavigator value) - { - foreach (XPathNavigator nav in _navigators) - { - if (nav.IsSamePosition(value)) + /// <summary> + /// Adds a <see cref="IEnumerable<XPathNavigator>"/> containing a set of navigators to add. + /// </summary> + /// <param name="navigators">The set of navigators to add. Each one is cloned automatically.</param> + public void Add(IEnumerable<XPathNavigator> navigators) { - return true; - } - } - return false; - } - - /// <summary> - /// Removes all items from the list. - /// </summary> - public void Clear() - { - _navigators.Clear(); - } - - - /// <summary> - /// Removes the list item at the specified index. - /// </summary> - /// <param name="index">The zero-based index of the item to remove.</param> - public void RemoveAt(int index) - { - _navigators.RemoveAt(index); - } - - /// <summary> - /// Determines whether the list contains a navigator whose Value property matches - /// the target value - /// </summary> - /// <param name="value">The value to locate in the list.</param> - /// <returns>true if the value is found in the list; otherwise, false.</returns> - public bool ContainsValue(string value) - { + if (_position != -1) + throw new InvalidOperationException( + SR.XPathNavigatorIterator_CantAddAfterMove); - foreach (XPathNavigator nav in _navigators) - { - if (nav.Value.Equals(value)) - { - return true; + foreach (XPathNavigator navigator in navigators) + { + _navigators.Add(navigator.Clone()); + } } - } - return false; - } - /// <summary> /// Resets the iterator. @@ -236,7 +121,8 @@ /// </summary> public override XPathNodeIterator Clone() { - return new XPathNavigatorIterator(_navigators); + return new XPathNavigatorIterator( + new List<XPathNavigator>(_navigators)); } /// <summary> |