public static NamespaceList Intersection(NamespaceList o1, NamespaceList o2, bool v1Compat)
{
NamespaceList nslist = null;
Debug.Assert(o1 != o2); //clause 1
if (o1.type == ListType.Any) //clause 2 - o1 is any
{
nslist = o2.Clone();
}
else if (o2.type == ListType.Any) //clause 2 - o2 is any
{
nslist = o1.Clone();
}
else if (o1.type == ListType.Set && o2.type == ListType.Other) //Clause 3 o2 is other
{
nslist = o1.Clone();
nslist.RemoveNamespace(o2.targetNamespace);
if (!v1Compat)
{
nslist.RemoveNamespace(string.Empty); //remove ##local
}
}
else if (o1.type == ListType.Other && o2.type == ListType.Set) //Clause 3 o1 is other
{
nslist = o2.Clone();
nslist.RemoveNamespace(o1.targetNamespace);
if (!v1Compat)
{
nslist.RemoveNamespace(string.Empty); //remove ##local
}
}
else if (o1.type == ListType.Set && o2.type == ListType.Set) //clause 4
{
nslist = o1.Clone();
nslist = new NamespaceList();
nslist.type = ListType.Set;
nslist.set = new Hashtable();
foreach (string ns in o1.set.Keys)
{
if (o2.set.Contains(ns))
{
nslist.set.Add(ns, ns);
}
}
}
else if (o1.type == ListType.Other && o2.type == ListType.Other)
{
if (o1.targetNamespace == o2.targetNamespace) //negation of same namespace name
{
nslist = o1.Clone();
return(nslist);
}
if (!v1Compat)
{
if (o1.targetNamespace == string.Empty) // clause 6 - o1 is negation of absent
{
nslist = o2.Clone();
}
else if (o2.targetNamespace == string.Empty) //clause 6 - o1 is negation of absent
{
nslist = o1.Clone();
}
}
//if it comes here, its not expressible //clause 5
}
return(nslist);
}