internal static MergeRowTree CreateMergeRowTree <RowType>(
     string nodeName, ReadOnlyCollection <MergeField <RowType> > fields, IEnumerable <RowType> dataRows, ReadOnlyCollection <MergeDataTreeChild <RowType> > children,
     MergeDataTreeRemapping remapping)
 {
     return(new MergeRowTree(
                remapping.NodeNameOverride.Any() ? remapping.NodeNameOverride : nodeName,
                dataRows.Select(
                    row =>
                    new MergeRow(
                        from field in fields
                        from name in remapping.GetFieldNames(field.Name)
                        select field.CreateValue(name, field.MsWordName, field.GetDescription, () => row),
                        children?.SelectMany(child => child.CreateRowTreesForParentRow(row, remapping)) ?? new MergeRowTree[0])),
                remapping.XmlRowElementName.Any() ? remapping.XmlRowElementName : "Row"));
 }