/// <summary> /// Implements the following function /// boolean subset(node-set, node-set) /// </summary> /// <param name="nodeset1">An input nodeset</param> /// <param name="nodeset2">Another input nodeset</param> /// <returns>True if all the nodes in the first nodeset are contained /// in the second nodeset</returns> /// <remarks>THIS FUNCTION IS NOT PART OF EXSLT!!!</remarks> public bool subset(XPathNodeIterator nodeset1, XPathNodeIterator nodeset2) { if (nodeset1.Count > 125 || nodeset2.Count > 125) return subset2(nodeset1, nodeset2); //else XPathNavigatorIterator nodelist1 = new XPathNavigatorIterator(nodeset1, true); XPathNavigatorIterator nodelist2 = new XPathNavigatorIterator(nodeset2, true); foreach (XPathNavigator nav in nodelist1) { if (!nodelist2.Contains(nav)) { return false; } } return true; }
/// <summary> /// Implements the following function /// node-set difference(node-set, node-set) /// </summary> /// <param name="nodeset1">An input nodeset</param> /// <param name="nodeset2">Another input nodeset</param> /// <returns>The those nodes that are in the node set /// passed as the first argument that are not in the node set /// passed as the second argument.</returns> public XPathNodeIterator difference(XPathNodeIterator nodeset1, XPathNodeIterator nodeset2) { if (nodeset2.Count > 166) return difference2(nodeset1, nodeset2); //else XPathNavigatorIterator nodelist1 = new XPathNavigatorIterator(nodeset1, true); XPathNavigatorIterator nodelist2 = new XPathNavigatorIterator(nodeset2); for (int i = 0; i < nodelist1.Count; i++) { XPathNavigator nav = nodelist1[i]; if (nodelist2.Contains(nav)) { nodelist1.RemoveAt(i); i--; } } nodelist1.Reset(); return nodelist1; }
/// <summary> /// Implements the following function /// node-set intersection(node-set, node-set) /// </summary> /// <param name="nodeset1">The first node-set</param> /// <param name="nodeset2">The second node-set</param> /// <returns>The node-set, which is the intersection /// of nodeset1 and nodeset2 /// </returns> public XPathNodeIterator intersection(XPathNodeIterator nodeset1, XPathNodeIterator nodeset2) { if (nodeset1.Count >= 500 || nodeset2.Count >= 500) return intersection3(nodeset1, nodeset2); //else XPathNavigatorIterator nodelist1 = new XPathNavigatorIterator(nodeset1, true); XPathNavigatorIterator nodelist2 = new XPathNavigatorIterator(nodeset2); for (int i = 0; i < nodelist1.Count; i++) { XPathNavigator nav = nodelist1[i]; if (!nodelist2.Contains(nav)) { nodelist1.RemoveAt(i); i--; } } nodelist1.Reset(); return nodelist1; }
/// <summary> /// Implements /// boolean hassamenode(node-set, node-set) /// </summary> /// <param name="nodeset1"></param> /// <param name="nodeset2"></param> /// <returns>true if both nodeset contain at least one of the same node</returns> public bool hasSameNode(XPathNodeIterator nodeset1, XPathNodeIterator nodeset2) { if (nodeset1.Count >= 250 || nodeset2.Count >= 250) return hasSameNode2(nodeset1, nodeset2); //else XPathNavigatorIterator nodelist1 = new XPathNavigatorIterator(nodeset1, true); XPathNavigatorIterator nodelist2 = new XPathNavigatorIterator(nodeset2, true); foreach (XPathNavigator nav in nodelist1) { if (nodelist2.Contains(nav)) { return true; } } return false; }