/// <summary>The outermost call is special.</summary>
 /// <remarks>
 /// The outermost call is special. The names almost certainly differ. The
 /// qualifiers (and hence options) will differ for an alias to the x-default
 /// item of a langAlt array.
 /// </remarks>
 /// <param name="aliasNode">the alias node</param>
 /// <param name="baseNode">the base node of the alias</param>
 /// <param name="outerCall">marks the outer call of the recursion</param>
 /// <exception cref="XmpException">Forwards XMP errors</exception>
 private static void CompareAliasedSubtrees(XmpNode aliasNode, XmpNode baseNode, bool outerCall)
 {
     if (!aliasNode.Value.Equals(baseNode.Value) || aliasNode.GetChildrenLength() != baseNode.GetChildrenLength())
     {
         throw new XmpException("Mismatch between alias and base nodes", XmpErrorCode.BadXmp);
     }
     if (!outerCall && (!aliasNode.Name.Equals(baseNode.Name) || !aliasNode.Options.Equals(baseNode.Options) || aliasNode.GetQualifierLength() != baseNode.GetQualifierLength()))
     {
         throw new XmpException("Mismatch between alias and base nodes", XmpErrorCode.BadXmp);
     }
     for (IIterator an = aliasNode.IterateChildren(), bn = baseNode.IterateChildren(); an.HasNext() && bn.HasNext();)
     {
         var aliasChild = (XmpNode)an.Next();
         var baseChild  = (XmpNode)bn.Next();
         CompareAliasedSubtrees(aliasChild, baseChild, false);
     }
     for (IIterator an1 = aliasNode.IterateQualifier(), bn1 = baseNode.IterateQualifier(); an1.HasNext() && bn1.HasNext();)
     {
         var aliasQual = (XmpNode)an1.Next();
         var baseQual  = (XmpNode)bn1.Next();
         CompareAliasedSubtrees(aliasQual, baseQual, false);
     }
 }